我曾经在工作中写过一个多线程的程序,它需要把while循环放到多线程里不断地执行,但是这样线程就不会停止了,一开始我想过在某个时刻调用interrupt()方法停掉线程,但是这样其实是不好的,当时有个同事和我说可以设计一个boolean型开关,当想让该循环的多线程运行时就把它设为true,想跳出循环时便设为false,可优雅的关闭和开启所有的多线程,就用到了volatile关键字,这里记录下它的应用。
volatile关键字在多线程里的应用是当我们将一个变量声明为volatile时,只要对这个变量产生了写操作,那么所有的读操作就都可以看到这个的修改,有点静态的意思在里面,但是这仅局限于同一个Runnable对象内,当创建多个Runnable对象时,便不适用。
通过volatile关键字控制多线程循环的跳出:
public class VolatileRunnable implements Runnable{
private volatile boolean flag=true;
private String name;
public VolatileRunnable(String name) {
this.name=name;
}
public void setFlag(boolean flag) {
this.flag=flag;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(flag) {
System.out.println(name);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("线程:"+name+"终止!!!!!!!!!!!!!");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
VolatileRunnable vr=new VolatileRunnable("kobe");
new Thread(vr).start();
new Thread(vr).start();
new Thread(vr).start();
try {
Thread.sleep(5000);
vr.setFlag(false);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出:
kobe
kobe
kobe
kobe
kobe
kobe
kobe
线程:kobe终止!!!!!!!!!!!!!
线程:kobe终止!!!!!!!!!!!!!
线程:kobe终止!!!!!!!!!!!!!
同一个Runnable对象,开启三个线程执行循环,只需把flag这个开关置为false,三个多线程便都会停止。