三
如何停止一个正在运行的线程?
1)使用定义一个volatile的退出标志终止线程
class ThreadFlag extends Thread{
private volatile boolean exit = false;
public void shutdown(){
exit = true;
}
@Override
public void run() {
while (!exit);
}
}
ThreadFlag threadFlag = new ThreadFlag();
threadFlag.start();
Thread.sleep(5*1000);
threadFlag.shutdown();
threadFlag.join();
2)使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。
3)使用interrupt方法中断线程
class ThreadInterrupt extends Thread{
@Override
public void run() {
try {
sleep(50000);
} catch (InterruptedException e) {
System.err.println(e.getMessage());
}
}
}
ThreadInterrupt threadInterrupt = new ThreadInterrupt();
threadInterrupt.start();
System.in.read();
threadInterrupt.interrupt();
threadInterrupt.join();
四
volatile关键字是如何保证内存可见性
说白了volatile修饰的变量,JVM保证了每次读变量都从内存中读,而不是CPU cache。见面试5,里面有详细讲解。
|