技术清单
申明:本文属于整理加工原创,部分举证材料来自于网络,仅用于学习参考。
本文主要介绍java多线程相关知识,通过本文讲解,你可以明白:
1、有三个线程T1,T2,T3,怎么确保它们按顺序执行(join())?
2、Java中如何正确地停止和暂停一个线程?interrupted 和 isInterrupted方法的区别?
3、notify 和 notifyAll有什么区别?为什么wait, notify 和 notifyAll这些方法不在thread类里面?
4、Java线程池中submit()和execute()方法有什么区别?
5、实现单例模式的方法有哪些?单例模式的双检锁是什么?饿汉模式与懒汉模式?
技术解析
一、有三个线程T1,T2,T3,怎么确保它们按顺序执行(join())?
在多线程中有多种方法让线程按特定顺序执行,可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。
public class Test {
public static void main(String[] args) throws InterruptedException{
Thread t1 = new Thread() {
@Override
public void run() {
for (int i = 1; i < 10; i++) {
System.out.println(i);
}
}
};
Thread t2 = new Thread() {
@Override
public void run() {
for(int i = 10; i < 20;i++) {
System.out.println(i);
}
}
};
Thread t3 = new Thread() {
@Override
public void run() {
for(int i = 20; i < 30; i++) {
System.out.println(i);
}
}
};
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
t3.join();
}
}
二、Java中如何正确地停止和暂停一个线程?interrupted 和 isInterrupted方法的区别?
停止一个线程可以用Thread.stop()方法,但最好不要用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是已被废弃的方法。
1、在java中有以下3种方法可以终止正在运行的线程:
1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止;
2)使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法;
3)使用interrupt方法中断线程。
2、interrupt()方法:
前面两个是判断是否中断的方法,而interrupt()就是真正触发中断的方法。
我们先看下interrupt的定义:
public void interrupt() {
if (this != Thread.currentThread())
checkAccess();
synchronized (blockerLock) {
Interruptible b = blocker;
if (b != null) {
interrupt0(); // Just to set the interrupt flag
b.interrupt(this);
return;
}
}
interrupt0();
}
作用是中断线程。将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示值是否为true)。它并不像stop方法那样会中断一个正在运行的线程;
interrupt()方法只是改变中断状态,不会中断一个正在运行的线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会