Java多线程技能(读书笔记:《Java多线程编程核心技术》)
一个程序的执行代表一个进程,线程是一个进程里面的独立运行的子任务。
线程各个状态,图片截取自《Java多线程编程核心技术》。
(start顺序不代表运行启动顺序,从上图可以看出start后线程只是编程了就绪状态,具体执行顺序要看cpu分配)
线程的两种实现方式:
- 继承Thread类:
1 public class MyThread extends Thread { 2 @Override 3 public void run() { 4 super.run(); 5 System.out.println(); 6 } 7 } 8 9 MyThread thread = new MyThread(); 10 thread.start();
注意对于同一个线程,多次调用它的start方法,会出现异常IllegalThreadStateException。
- 实现接口的方式(Runnable、Callable):
1 pulbic class MyRunnable implements Runnable { 2 3 @Override 4 5 public void run() { 6 System.out.println(); 7 } 8 9 } 10 11 Runnable runnable = new MyRunnable(); 12 Thread thread = new Thread(runnable); 13 thread.start();
如果使用实现带有返回值的Callable接口,需要使用FutureTask。
1 public class MyCallable implements Callable<String> { 2 @Override 3 public String call() throws Exception { 4 return "call"; 5 } 6 } 7 8 MyCallable myCallable = new MyCallable(); 9 FutureTask<Integer> futureTask = new FutureTask<>(myCallable); 10 Thread thread = new Thread(futureTask); 11 thread.start(); 12 13 String result = future.get(); //阻塞,直到出现运行结果并返回
由于Java不支持多继承的方式,为了尽量改变这种局限性,推荐使用实现接口的方式。
判断线程是否终止的方法:
public static boolean interrupted();
public boolean isInterrupted();
测试线程是否已经中断(可以判断当前线程Thread.interrupted()),interrupted方法会清除线程的终止状态。isInterrupted方法,不清除状态。
使用interrupt()后,处于停止状态的线程,不一定会直接退出。
interrupt方法只是修改线程处于停止状态,退出线程需要结合异常或者return使用。
(线程停止的方法还有stop方法,但是被废弃了,由于stop方法会让线程暴力停止,可能导致不完整的残废数据。)