2021年3月5日星期五

Java并发编程之线程的停止

简介

一般情况下,线程执行完成后就会结束,但有的时候我们可能需要在它正常执行完成前就停止它,可以考虑使用以下三种方法:

  1. 使用Thread中的stop方法,这个方法已经被标为已废弃,不推荐使用,原因是stop方法会立即终止线程并释放持有的锁,在多线程的情况下可能会导致数据不一致的问题。

  2. 自定义一个标志,通过修改这个标志的值来让线程判断是否需要退出。

  3. 使用线程中断机制。

后面两种方法有点类似,都是通过给线程发一个通知,然后让线程去判断是否可以结束,而不是像stop方法那样暴力的终止线程,下面介绍下后两种方法的使用和区别。

使用自定义标志停止线程

这里定义了一个变量flag,主线程会在3秒后将flag设置为false,当flag为false的时候,run方法里面的循环就会结束,线程也就停止了。

public class MyThread extends Thread{ volatile boolean flag = true; @Override public void run() {  while (flag){   System.out.println("do something...");  } } public static void main(String[] args) throws InterruptedException {  MyThread myThread = new MyThread();  myThread.start();  Thread.sleep(3000);  myThread.flag = false; }}

使用线程中断机制停止线程

线程中断有关的三个方法:

  1. interrupt(),中断线程。
  2. isInterrupted(),判断线程是否被中断。
  3. interrupted,Thread类的静态方法,判断线程是否被中断,并清除中断状态。

这种方式与前面那种方式很类似,只是由判断flag变为判断线程是否被中断。

public class MyThread extends Thread{ @Override public void run() {  while (!isInterrupted()){   System.out.println("do something...");  } } public static void main(String[] args) throws InterruptedException {  MyThread myThread = new MyThread();  myThread.start();  Thread.sleep(3000);  myThread.interrupt(); }}

自定义标志和线程中断机制的区别

前面介绍的两种方式使用起来非常的类似,但是中断机制要更强,因为当循环体内出现了Thread.sleep()或者wait()这样的操作时,自定义标志的方式就只能等阻塞结束。而这两个方法是可以响应中断的。

1.主线程在3秒后更改flag状态,但是线程还处于sleep()阻塞中,需要等到sleep()时间结束也就是10秒后线程才停止。

public class MyThread extends Thread{ volatile boolean flag = true; @Override public void run() {  while (flag){   try {    Thread.sleep(10000);   }catch (InterruptedException ex){    ex.printStackTrace();   }   System.out.println("do something...");  } } public static void main(String[] args) throws InterruptedException {  MyThread myThread = new MyThread();  myThread.start();  Thread.sleep(3000);  myThread.flag = false; }}

2.处于sleep()阻塞中的线程如果被中断就会抛出InterruptedException异常,此时它会清除中断标记,所以需要捕获该异常,并在异常处理中再次设置中断标记。

public class MyThread extends Thread{ @Override public void run() {  while (!isInterrupted()){   try {    Thread.sleep(10000);   }catch (InterruptedException ex){    //重新设置中断标记    interrupt();   }   System.out.println("do something...");  } } public static void main(String[] args) throws InterruptedException {  MyThread myThread = new MyThread();  myThread.start();  Thread.sleep(3000);  myThread.interrupt(); }}








原文转载:http://www.shaoqun.com/a/605580.html

跨境电商:https://www.ikjzd.com/

rakuten:https://www.ikjzd.com/w/2718

ebay易趣:https://www.ikjzd.com/w/210


简介一般情况下,线程执行完成后就会结束,但有的时候我们可能需要在它正常执行完成前就停止它,可以考虑使用以下三种方法:使用Thread中的stop方法,这个方法已经被标为已废弃,不推荐使用,原因是stop方法会立即终止线程并释放持有的锁,在多线程的情况下可能会导致数据不一致的问题。自定义一个标志,通过修改这个标志的值来让线程判断是否需要退出。使用线程中断机制。后面两种方法有点类似,都是通过给线程发一
心怡:https://www.ikjzd.com/w/1327
递四方:https://www.ikjzd.com/w/1066
米兰网:https://www.ikjzd.com/w/1304.html
最长"黑五"来袭,亚马中国逊继续押注跨境电商!:https://www.ikjzd.com/home/110887
​如何决胜旺季?全球95后消费群体不容忽视!:https://www.ikjzd.com/home/111697
马士基集团:https://www.ikjzd.com/w/1296