Java原来有stop方法可以停止线程,但现在那方法过时了,只有一种方法可以停止线程那就是让run方法结束。而我们的run方法里基本都会写while循环,只要我们能控制while循环,就能控制run方法,就能控制线程。
Demo1:控制flag停止线程
class StopThread implements Runnable{
private boolean flag =true;
public void run(){
while(flag){
System.out.println(Thread.currentThread().getName()+"....run");
}
}
public void changeFlag(){
flag = false;
}
}
class StopThreadDemo{
public static void main(String[] args) {
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
int num = 0;
while(true){
if(num++ == 60){
st.changeFlag();
break;
}
System.out.println(Thread.currentThread().getName()+"......."+num);
}
System.out.println("over");
}
}
在主线程输出完60次之后,把其他线程的flag变为false,其他线程的while循环结束,run方法结束,线程也随之结束。 但是这样使用有一个问题,就是当wait或者sleep等让线程进入冻结状态之后,改变flag也不能让线程结束,比如下面的代码。
Demo2:wait之后,改变flag不能使线程退出
class StopThread implements Runnable{
private boolean flag =true;
public synchronized void run(){
while(flag){
try {
wait();
} catch (InterruptedException e) {
System.out.println("Exception");
}
System.out.println(Thread.currentThread().getName()+"....run");
}
}
public void changeFlag(){
flag = false;
}
}
class StopThreadDemo{
public static void main(String[] args) {
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
int num = 0;
while(true){
if(num++ == 60){
st.changeFlag();
break;
}
System.out.println(Thread.currentThread().getName()+"......."+num);
}
System.out.println("over");
}
}
上面这种情况t1,t2两个线程进去后都被wait了,就算flag改变也无济于事,线程不会结束。所以Java还提供了另外一个函数来解决这种情况,那就是interrupt()。它能够清除由wait,sleep,join等造成的冻结状态,然后抛出一个异常。
Demo3:interrupt的使用
class StopThread implements Runnable{
private boolean flag =true;
public synchronized void run(){
while(flag){
try {
wait();
} catch (InterruptedException e) {
System.out.println("Exception");
flag = false;
}
System.out.println(Thread.currentThread().getName()+"....run");
}
}
// public void changeFlag(){
// flag = false;
// }
}
class StopThreadDemo{
public static void main(String[] args) {
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
int num = 0;
while(true){
if(num++ == 60){
// st.changeFlag();
t1.interrupt();
t2.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+"......."+num);
}
System.out.println("over");
}
}
在主函数运行60次之后,会强制让t1,t2唤醒,因为使用interrupt会抛出一个异常,我们捕获到这个异常之后可以直接在catch语句中让flag变为false,使线程结束。