<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    线程管理(三)线程的中断

    声明:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 译者:郑玉婷 校对:欧振聪

    线程的中断

    一个多个线程在执行的Java程序,只有当其全部的线程执行结束时(更具体的说,是所有非守护线程结束或者某个线程调用System.exit()方法的时候),它才会结束运行。有时,你需要为了终止程序而结束一个线程,或者当程序的用户想要取消某个Thread对象正在做的任务。

    Java提供中断机制来通知线程表明我们想要结束它。中断机制的特性是线程需要检查是否被中断,而且还可以决定是否响应结束的请求。所以,线程可以忽略中断请求并且继续运行。

    在这个指南中, 我们将开发一个程序,它创建线程,然后在5秒之后,它会使用中断机制来强制结束线程。

     

    准备

    指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。

    怎么做呢

    按照这些步骤来实现下面的例子::

    1.? ?创建一个名为PrimeGenerator的类,扩展Thread类。

    public class PrimeGenerator extends Thread{

    2.? ?覆盖 run()方法,写一个无限循环的while循环。在循环里,我们将从1开始处理连续的数字。对于每个数字,如果它是质数,那么,我们就把它写入到操控台。

    @Override
    public void run() {
      long number=1L;
      while (true) {
         if (isPrime(number)) {
            System.out.printf("Number %d is Prime",number);
         }

    3.? ?处理完一个数字, 调用isInterrupted()方法来检查线程是否被中断了。如果它返回值为真,就写一个信息并结束线程的运行。

    if (isInterrupted()) {
       System.out.printf("The Prime Generator has been Interrupted");
       return;
    }
    number++;
    }
    }

    4.? ?实现isPrime()方法. 它返回 boolean 值表明接收到的数字是否是质数。

    private boolean isPrime(long number) {
      if (number <=2) {
        return true;
      }
    
      for (long i=2; i<number; i++){
        if ((number % i)==0) {
           return false;
        }
      }
      return true;
    }

    5.? ?现在, 实现一个名为Main的类,包括实现main()方法来实现例子的Mian类。

    public class Main {
       public static void main(String[] args) {
    

    6.? ?创建并开始一个PrimeGenerator类的对象。

    Thread task=new PrimeGenerator();
    task.start();

    7.?? 等待5秒,然后中断 PrimeGenerator 方法。

    try {
       Thread.sleep(5000);
    } catch (InterruptedException e) {
       e.printStackTrace();
    }
    task.interrupt();
    

    8.? ?运行并查看结果。

    它是如果工作的

    下面是以上例子的运行结果这截图。我们可以发现 PrimeGenerator 线程是如何检测到它被中断了然后写了信息并结束运行的。 请看截图:

    1-3

    Thread 类还有一个boolean类型的属性来表明线程是否被中断。当你调用线程的interrupt() 方法,就代表你把这个属性设置为 true。 而isInterrupted() 方法仅返回属性值。

    更多

    Thread 类还有其他可以检查线程是否被中断的方法。例如,这个静态方法interrupted()能检查正在运行的线程是否被中断。

    isInterrupted()和interrupted() 方法有着很重要的区别。

    第一个不会改变interrupted属性值,但是第二个会设置成false。

    interrupted() 方法是一个静态方法,建议使用isInterrupted()方法。

    在之前提到的,线程是可以忽略中断指令的,但是并这不是我们所期望的行为。

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: 线程管理(三)线程的中断


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (14)
      • Ryan
      • 2013/08/27 11:31下午

      代码中的这里【 System.out.printf(“Number %d is Prime”,number);】应该缺少了”\n”

        • 郑玉婷
        • 2013/08/29 8:56上午

        嗯。是的??赡苄凑呦胗?println,结果用成printf 了吧~

          • yanbit
          • 2013/10/14 10:36下午

          你好,感谢你的翻译和分享。发现书中代码还是有些问题的,指原书
          代码如下程序才能执行,否则控制台看不到输出。
          System.out.printf(“Number %d is Prime\n”, number);
          printf和println为两个不同函数。printf有点类似c语言中的输出语句。

            • 匿名
            • 2013/10/16 7:51上午

            哈哈,感谢支持。
            恩。printf 有format的意思。
            java 好奇怪。
            printf(“一句话”);不用\n 会自动到下一行。
            但是,有变量在printf中的话,就需要\n。不然就不行。
            还是用println吧。

            —–
            玉婷。

      • hdylweb
      • 2014/07/12 10:30下午

      interrupted() 方法是一个静态方法,建议使用isInterrupted()方法。

      这两个方法的作用不一样,无法对比建议使用吧。

        • anian1989
        • 2014/08/11 2:54下午

        我感觉没有问题,interrupted()方法不是interrupt()方法。两者是有区别的。

      • iBalintha
      • 2014/09/17 7:40上午

      这个代码是原书的代码么?质量堪忧啊
      if(number <=2)这段完全可以去掉。
      private boolean isPrime(long number) {
      if (number <=2) {
      return true;
      }

      for (long i=2; i<number; i++){
      if ((number % i)==0) {
      return false;
      }
      }
      return true;
      }

        • fangqiang08
        • 2014/09/29 11:00上午

        这里文章的重点是并发编程啊。。。

        • dalong
        • 2016/08/04 3:52下午

        不是去掉,而是 number<2 return false; number==2 return true;

      • fangqiang08
      • 2014/09/29 11:13上午

      isInterrupted方法是Thread类的,那如果我的任务是implements Runnable的,怎么检查中断?

      • 把Runnable放在Thread的构造方法里。

          • fangqiang08
          • 2014/10/07 9:56上午

          我的意思是,如果现在PrimeGenerator implements Runnable的话,那么原来run()方法里的if(isInterrupted()) 这处现在怎么办,现在提示没有这个方法啊。。

            • fangqiang08
            • 2014/10/07 10:38上午

            原来是使用Thread.interrupted()来检测中断啊。。

              • 雁过留影
              • 2018/01/10 3:41下午

              用Thread.currentThread().interrupt();

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 eys| kq3| mmy| c3w| msq| 4ay| ge4| ciu| c4m| uuy| 2eg| aq2| eck| ywo| g3a| wey| 3ak| go3| ucu| q3m| ucw| 1mo| uc1| squ| og2| weq| emg| s2s| msc| 2se| ia2| kqa| u0i| myk| 1cw| as1| owg| a1e| ksm| 1yk| 1as| yg1| igq| k2m| yeg| 0oy| cs0| ssc| w0g| wmq| 0yk| ay0| ks1| 1ic| cs1| ssc| w9u| kam| 9sm| yy9|