java多线程入门(一)

115 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

  • 多线程怎么说那就好比你一边听歌,一边烧水,一边敲代码时间充分利用起来了。

  • 多线程的实现是CPU支持的它会保留每个线程的信息例如寄存器的信息代码执行位置等,然后进行切换执行,对于用户来说是无感的。

1.多线程的实现方式

1.1继承 Thread

public class HelloThread extends Thread{
	@Override
	public void run() {
		System.out.println("thread");
	}
	public static void main(String[] args) {
		Thread th=new HelloThread();
		th.start();
	}
}

1.2.实现接口 Runnable

public class HelloThreadImp implements Runnable{
	@Override
	public void run() {
		System.out.println("rannable");
	}
	public static void main(String[] args) {
		Runnable hti=new HelloThreadImp();
		Thread t=new Thread(hti);
		t.start();
	}
}

1.3.实现接口 Callable 结合FutureTask 带返回值的

public class HellloThreadCallable implements Callable<String>  {
	@Override
	public String call() throws Exception {
		return "threadCallable";
	}
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		HellloThreadCallable htc=new HellloThreadCallable();
		FutureTask<String> ft=new FutureTask<String>(htc);
		new Thread(ft).start();
		String result=ft.get();
		System.out.println(result);
	}
}

2.停止线程的几种方式

2.1 return

2.2 向外抛异常

2.3 全局变量判断结合1,2

2.4 使用interrupt()中断线程

Thread.isInterrupted() //判断是否被中断 
Thread.interrupted()   //判断是否被中断,并清除当前中断状态 注意第二次调用返回false
                       //遇到Thread.sleep会报异常
public class ThreadInterrupt implements Runnable {

	@Override
	public void run() {
		int i = 0;
		while (true) {
			if (Thread.currentThread().isInterrupted()) {
				System.out.println("线程终止");
				return;
			} else {
				System.out.println(++i);
				if (i % 10000 == 0) {
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
						return;
					}
				}
			}
		}
	}

	public static void main(String[] args) throws InterruptedException {
		ThreadInterrupt ti = new ThreadInterrupt();
		Thread t = new Thread(ti);
		t.start();
		Thread.sleep(200);
		t.interrupt();
	}

}

image.png

image.png

2.5 使用stop方法 已经被弃用了

2.6 直接系统退了

  • java.lang.System.exit()

3.线程现有的一些方法

3.1设置优先级

//1-10 优先级高的不一定会先执行完,就是被执行的概率大

thred.setPriority(1);

3.2设置守护线程

//线程分为用户线程和守护线程,当所有的线程都是守护线程的时候 守护线程会自动销毁的,典型的守护线程是垃圾线程

//启动线程之前调用一个线程的setDaemon()方法

thred.setDaemon(true);

3.3判断线程是否存活

启动未终止

thred.isAlive();

4.sleep、yield区别

  • yield放弃时间不确定,有可能立马又被CPU执行;而sleep会让线程阻塞指定的时间
  • sleep方法不考虑线程优先级,yield方法只会给相同优先级或者更高优先级线程运行
  • yield没有声明异常,sleep会被interrupted打断
  • yield和sleep 它们都是静态方法,不会释放资源锁