广州网站建设公司乐云seo598,吴江高端网站建设,宿迁做网站哪家公司好,网络平台 策划方案1、正常运行结束
程序运行结束#xff0c;线程自动结束。
2、使用stop方法强制终止
不安全#xff0c;不建议使用#xff1a;
调用 stop() 方法会立刻停止 run() 方法中剩余的全部任务#xff0c;包括在 catch 或 finally 语句中的#xff0c;并抛出ThreadDeath异常线程自动结束。
2、使用stop方法强制终止
不安全不建议使用
调用 stop() 方法会立刻停止 run() 方法中剩余的全部任务包括在 catch 或 finally 语句中的并抛出ThreadDeath异常因此可能会导致任务执行失败。
调用 stop() 方法会立即释放该线程所持有的所有的锁导致数据得不到同步出现数据不一致的问题。一般任何进行加锁的代码块都是为了保护数据的一致性如果在调用 thread.stop() 后导致了该线程所持有的所有锁的突然释放(不可控制)那么被保护数据就有可能呈现不一致性其他线程在使用这些被破坏的数据时有可能导致一些很奇怪的应用程序错误。因此并不推荐使用stop方法来终止线程。
3、 使用volatile标记位退出线程
定义了一个退出标志exit当exit为true时while循环退出exit的默认值为false。在定义exit 时使用了一个 Java 关键字 volatile这个关键字的目的是使 exit 同步也就是说在同一时刻只能由一个线程来修改exit的值。
public class ThreadSafe extends Thread { public volatile boolean exit false; public void run() { while (!exit){ //do something } }
}4、使用 interrupt ()方法终止线程
在Thread中提供了一个interrupt()方法从名字看表示中断但实际上并不像stop()方法一样直接中断线程而是向子线程发送一个中断的通知。至于目标线程收到通知后会如何处理则完全由目标线程自行决定。与interrupt()相配合的就是isInterruptted()功能是判断是否收到了可以中断的请求。
使用interrupt()方法来终止来终止线程分为两种情况
1)线程处于阻塞状态如果线程是sleepjoin和waiting等阻塞状态此时没有获得CPU时间片也就无法及时感知到isInterrupted状态的变化。当调用线程的interrupt()方法时会抛出InterruptException异常。阻塞中的那个方法抛出这个异常通过代码捕获该异常然后break跳出循环状态从而让我们有机会结束这个线程的执行。很多人认为只要调用interrupt方法线程就会结束实际上是错的 一定要先捕获InterruptedException异常之后通过break来跳出循环才能正常结束run方法。
2)线程未处于阻塞状态使用isInterrupted()判断线程的中断标志来退出循环。当使用interrupt()方法时中断标志就会置true和使用自定义的标志来控制循环是一样的道理。
为什么要区分进入阻塞状态和和非阻塞状态两种情况了是因为当阻塞状态时如果有interrupt()发生系统除了会抛出InterruptedException异常外还会调用interrupted()函数调用时能获取到中断状态是true的状态调用完之后会复位中断状态为false所以异常抛出之后通过isInterrupted()是获取不到中断状态是true的状态从而不能退出循环因此在线程未进入阻塞的代码段时是可以通过isInterrupted()来判断中断是否发生来控制循环在进入阻塞状态后要通过捕获异常来退出循环。因此使用interrupt()来退出线程的最好的方式应该是两种情况都要考虑。
public class ThreadSafe extends Thread {public void run() {while (!isInterrupted()){ //非阻塞过程中通过判断中断标志来退出 try{ Thread.sleep(5*1000);//阻塞过程捕获中断异常来退出 }catch(InterruptedException e){ e.printStackTrace(); break;//捕获到异常之后执行break跳出循环 } } }
}