目录
线程创建方式
1.继承Thread类
2.实现Runnable接口
3.实现callable接口
callable 创建有返回值的线程
/**
* @author zp
* @Description: 创建可返回结果的线程
* 继承Runnable接口 或者 实现thread类 实现run方法 线程执行完之后并没有返回值
* @date 2018/9/21 下午2:29
*/
public class CallableTest {
public static void main(String[] args) throws InterruptedException,ExecutionException{
ExecutorService service = Executors.newSingleThreadExecutor();
Future<String> task = service.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return "callable返回值";
}
});
System.out.println(task.get());
}
}
线程状态转换
新建(NEW) : 线程被创建,还没有调用start()方法
就绪(RUNNABLE): 线程在等待运行(等待cpu 分配给时间片后方可运行)或者线程正在运行。有的说法是将就绪拆分成就绪和运行两种状态。等待运行时 ,线程位于可运行池中
阻塞(BLOCK): 当线程等待锁时,线程处于阻塞状态。阻塞状态的线程位于锁池。有的说法将线程调用sleep()方法后也成为阻塞状态
等待(WAITING) : 当线程调用wait()方法后线程变为等待状态,当一个线程被通知,如调用notify()方法后线程处于就绪状态。此时线程位于等待池。
超时等待: 进入条件和进入等待状态类似,但是调用的是超时等待的方法
消亡(DEAD): 当线程的run()方法执行完毕或者线程因为异常退出了run()方法。
线程状态流转图,此图来源于《JAVA并发编程的艺术》
线程常用方法
start()方法:线程类调用start()方法后,线程类才能作为线程去执行run()方法。如果不调用start()方法就调用run ()方法,线程会执行run()方法,但是不会以线程的方式去运行,仅仅相当于一个普通方法。
sleep()方法:Thread类的静态方法,让线程休眠指定的时间。调用sleep()方法的线程如果持有锁并不会放弃锁的所有权。线程不论是否持有锁都可以调用sleep()方法。
join()方法:让出当前资源等其他线程执行完再继续执行本线程 。这个方法比较难理解 ,比方在主线程A中,调用线程b 的 join()方法 ,可以理解为在主方法调用线程b 的join 方法
public class JoinTest {
public static void main(String[] args) throws InterruptedException {
Thread b = new Thread(() -> {
try {
System.out.println("b线程开始睡眠");
Thread.sleep(5000);
System.out.println("b线程睡醒了");
} catch (InterruptedException e) {
}
});
b.start();
b.join();
System.out.println("b线程执行完后主线程执行了");
}
}
控制台打印顺序是
b线程开始睡眠
b线程睡醒了
b线程执行完后主线程执行了
Interrupt() 方法 ,中断线程。很多时候并不能直接中断线程 ,而是改变了一个线程标志位boolean 的值 。而中断操作是需要自己去实现的。一般实现方式,是根据中断标志的改变改结束执行线程。
public static void main(String[] args) throws InterruptedException{
Thread a = new Thread(()->{
try {
System.out.println("a线程开始睡眠");
Thread.sleep(5000);
System.out.println("a线程睡眠结束");
}catch (InterruptedException e){
System.out.println("a线程被中断");
e.printStackTrace();
}
});
a.start();
Thread.sleep(100);
System.out.println("主线程睡眠结束");
a.interrupt();
}
执行结果
a线程开始睡眠
主线程睡眠结束
java.lang.InterruptedException: sleep interrupted
a线程被中断
at java.lang.Thread.sleep(Native Method)
at com.example.demo.thread.InterruptTest.lambda$main$0(InterruptTest.java:14)
at java.lang.Thread.run(Thread.java:748)