线程如何停止呢
stop方法过时了,看起描述发现,有其他解决方案。
线程结束:就是让线程任务代码执行完,run方法结束。
run方法怎么结束呢?
run方法中通常都定义循环,只要控制住循环就哦了。
//演示停止线程。 class Demo implements Runnable { private boolean flag = true; public void run() { while(flag) { System.out.println(Thread.currentThread().getName()+"----->"); } } //对标记的修改方法。 public void changeFlag() { flag = false; } } class MStopThreadDemo { public static void main(String[] args) { Demo d = new Demo(); Thread t1 = new Thread(d); Thread t2 = new Thread(d); t1.start(); t2.start(); int x = 0; while(true) { if(++x == 50) { d.changeFlag();//改变线程任务代码的标记,让其他线程也结束。 break;//跳出循环,主线程可以结束。 } System.out.println("main-------->"+x); } System.out.println("over"); } }
注意:万一线程在任务中处于了冻结状态,那么它还能去判断标记吗?不能!
怎么办?通过查阅stop方法的描述,发现提供了一个解决方法:
如果目标线程等待很长时间,则应使用 interrupt 方法来中断该等待
所谓的中断并不是停止线程。
interrupt的功能是 将线程的冻结状态清除,让线程恢复到的运行状态(让线程重新具备cpu的执行资格)。
因为是强制性的所以会有异常InterruptedException发生,可以在catch中捕获异常,
在异常处理中,改变标记让循环结束,让run方法结束。
//演示停止线程。 class Demo implements Runnable { private boolean flag = true; public synchronized void run() {//不要这么做将synchronized加到run方法这已经变成了单线程了这里是故意这么做为了测试因为wait()必须要有所属的锁 while(flag) { try { wait();//t1 t2 //如果使用notify()必须和wait()在同一个锁里,那如果不在同一个锁怎么办只能用interrupt() } catch (InterruptedException e) { System.out.println(Thread.currentThread().toString()+"....."+e.toString()); changeFlag(); // 由于interrupt()方法是强制性让线程恢复到运行状态,既然是强制的就会抛出异常所以在异常捕获时将他标记进行修改 } System.out.println(Thread.currentThread().getName()+"----->"); } } //对标记的修改方法。 public void changeFlag() { flag = false; } } class MStopThreadDemo2 { public static void main(String[] args) { Demo d = new Demo(); Thread t1 = new Thread(d); Thread t2 = new Thread(d); t1.start();
t2.start(); int x = 0; while(true){ if(++x == 50){ //d.changeFlag();//改变线程任务代码的标记,让其他线程也结束。 //对t1线程对象进行中断状态的清除,强制让其恢复到运行状态。 t1.interrupt(); //对t2线程对象进行中断状态的清除,强制让其恢复到运行状态。 t2.interrupt(); break;//跳出循环,主线程可以结束。 } System.out.println("main-------->"+x); } System.out.println("over"); } }