文档章节

并发编程实战 1.3. 线程的中断 - interrupt()与isInterrupted()

火犀牛
 火犀牛
发布于 2016/05/10 21:44
字数 421
阅读 12
收藏 0

Java 提供了中断几只,我们可以使用它来结束一个线程。这种机制要求线程检查它是否被中断了,然决定是不是响应这个中断请求,或者继续执行。

范例:打印质数,2秒后结束

方法一:手动控制

package com.rr.concurrent.chapter1.recipe3.test;

/**
 * Created by isaac_gu on 2016/5/10.
 */
public class Task implements Runnable {

    @Override
    public void run() {
        Thread thread = Thread.currentThread();
        int i = 0;
        while (i++ >= 0) {
            if (thread.isInterrupted()) {
                System.out.println("线程被打断了!");
                //return;
                System.exit(0);
            } else if (isPrime(i)) {
                System.out.printf("%d 是 质数\r\n", i);
            }
        }
    }

    /**
     * 百度百科的实现方法
     *
     * @param n
     * @return
     */
    public static boolean isPrime(long n) {
        if (n <= 3) {
            return n > 1;
        }
        if (n % 2 == 0 || n % 3 == 0) {
            return false;
        }

        for (int i = 5; i * i <= n; i += 6) {
            if (n % i == 0 || n % (i + 2) == 0) {
                return false;
            }
        }
        return true;
    }
}

测试:

package com.rr.concurrent.chapter1.recipe3.test;


import java.util.concurrent.TimeUnit;

/**
 * Created by isaac_gu on 2016/5/10.
 * 打印质数,2秒后结束
 */
public class Test {
    public static void main(String[] args) {
        Thread thread = new Thread(new Task());
        thread.start();

        //睡眠2秒
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //2秒后打断
        thread.interrupt();

    }


}

检查线程是否被中断的方法有两种: isInterrupted() 和 静态方法Thread.interrupted();

方法二: 使用异常

package com.rr.current2.c1_3_interruptException.test;

/**
 * Created by Isaac on 16-5-10.
 */

/**
 * Created by isaac_gu on 2016/5/10.
 */
public class Task implements Runnable {

    @Override
    public void run() {
        try {
            print();
        } catch (InterruptedException e) {
            System.out.printf("%s: 线程被打断了!", Thread.currentThread().getName());
        }
    }

    public void print() throws InterruptedException {
        int i = 0;
        while (i++ >= 0) {
            if(Thread.interrupted()){
                throw new InterruptedException();
            } else if (isPrime(i)) {
                System.out.printf("%d 是 质数\r\n", i);
            }
        }
    }
    /**
     * 百度百科的实现方法
     *
     * @param n
     * @return
     */
    public static boolean isPrime(long n) {
        if (n <= 3) {
            return n > 1;
        }
        if (n % 2 == 0 || n % 3 == 0) {
            return false;
        }

        for (int i = 5; i * i <= n; i += 6) {
            if (n % i == 0 || n % (i + 2) == 0) {
                return false;
            }
        }
        return true;
    }
}

 

© 著作权归作者所有

共有 人打赏支持
火犀牛
粉丝 0
博文 27
码字总数 12180
作品 0
海淀
程序员
Java并发编程原理与实战四:线程如何中断

如果你使用过杀毒软件,可能会发现全盘杀毒太耗时间了,这时你如果点击取消杀毒按钮,那么此时你正在中断一个运行的线程。 java为我们提供了一种调用interrupt()方法来请求终止线程的方法,下...

pony1223
07/21
0
0
Java多线程 - 如何正确的终止线程

最近打算读一下《实战java高并发程序设计》,夯实一下java多线程的知识。接下来应该会写一系列的读书笔记,里面会有多处引用到书中的代码或者文字。本文就是第一篇。 不推荐使用的stop方法 Th...

嘉伟咯
2017/08/24
0
0
Java编程的逻辑 -- 并发章 -- 线程的中断

线程中断 线程不同状态对中断的反应 总结 线程中断 在Java中,停止一个线程的主要机制是中断,中断并不是强迫终止一个线程,它是一种协作机制,是给线程传递一个取消信号,但是由线程来决定如...

HikariCP
06/25
0
0
多线程编程读书笔记之线程中断的本质

Java试图提供过抢占式限制中断,但问题多多,例如已被废弃的Thread.stop、Thread.suspend和 Thread.resume等。另一方面,出于Java应用代码的健壮性的考虑,降低了编程门槛,减少不清楚底层机...

刘学炜
2012/07/03
0
0
interrupt、interrupted和isInterrupted的区别

1.interrupt() interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 注意:线程中断仅仅是改变线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态位并做出...

激情的狼王丶21
2017/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

wait()被notify()后,接着执行wait()后面的语句

wait()被notify()后,接着执行wait()后面的语句

noteman
16分钟前
0
0
Ubuntu集群-使用MAAS开始裸机安装

Ubuntu使用MAAS装机的七个步骤。 1、Setup your hardware You need one small server for MAAS and at least one server which can be managed with a BMC. It is recommended to have the M......

openthings
29分钟前
2
0
OSX | SafariBookmarksSyncAgent意外退出解决方法

1. 启动系统, 按住⌘-R不松手2. 在实用工具(Utilities)下打开终端,输入csrutil disable, 然后回车; 你就看到提示系统完整性保护(SIP: System Integrity Protection)已禁用3. 输入reboot回车...

云迹
今天
4
0
面向对象类之间的关系

面向对象类之间的关系:is-a、has-a、use-a is-a关系也叫继承或泛化,比如大雁和鸟类之间的关系就是继承。 has-a关系称为关联关系,例如企鹅在气候寒冷的地方生活,“企鹅”和“气候”就是关...

gackey
今天
4
0
读书(附电子书)|小狗钱钱之白色的拉布拉多

关注公众号,在公众号中回复“小狗钱钱”可免费获得电子书。 一、背景 之前写了一篇文章 《小狗钱钱》 理财小白应该读的一本书,那时候我才看那本书,现在看了一大半了,发现这本书确实不错,...

tiankonguse
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部