第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Java并發(fā)編程實(shí)戰(zhàn)系列7之取消與關(guān)閉

標(biāo)簽:
Java

JAVA媒体提供任务机制来安全的终止线程。但是它提供了中断(interruption),这是一种写作机制,能够使一个线程终止另外一个线程。

一般来说没人希望立即终止,因为必要时总要先清理再终止。

开发一个应用能够妥善处理失败、关闭、取消等过程非常重要也有挑战。

7.1 任务取消

一定不要使用Thread.stop和suspend这些机制。

一种协作机制就是“标记位”。例如使用volatile类型的field来保存取消状态。

@ThreadSafepublic class PrimeGenerator implements Runnable {    private static ExecutorService exec = Executors.newCachedThreadPool();    @GuardedBy("this") private final List<BigInteger> primes
            = new ArrayList<BigInteger>();    private volatile boolean cancelled;    public void run() {
        BigInteger p = BigInteger.ONE;        while (!cancelled) {
            p = p.nextProbablePrime();            synchronized (this) {
                primes.add(p);
            }
        }
    }    public void cancel() {
        cancelled = true;
    }    public synchronized List<BigInteger> get() {        return new ArrayList<BigInteger>(primes);
    }    static List<BigInteger> aSecondOfPrimes() throws InterruptedException {
        PrimeGenerator generator = new PrimeGenerator();
        exec.execute(generator);        try {
            SECONDS.sleep(1);
        } finally {
            generator.cancel();
        }        return generator.get();
    }
}

1.1 中断

下面的例子会出现死锁,线程根本不会停止

class BrokenPrimeProducer extends Thread {
    private final BlockingQueue<BigInteger> queue;    private volatile boolean cancelled = false;

    BrokenPrimeProducer(BlockingQueue<BigInteger> queue) {        this.queue = queue;
    }    public void run() {        try {
            BigInteger p = BigInteger.ONE;            while (!cancelled)                queue.put(p = p.nextProbablePrime());
        } catch (InterruptedException consumed) {
        }
    }    public void cancel() {
        cancelled = true;
    }
}

interrupt 方法:中断目标线程。isInterrupted:返回目标线程的中断状态。静态的 interrupted方法:清除当前线程的中断状态,并返回它之前的值。大多数可中断的阻塞方法会在入口处检查中断状态

对中断操作(调用interrupt)的正确理解
他并不会真正的中断一个正在运行的线程,而只是发出中断请求,然后由线程在下一个合适的时候中断自己。比如,wait、sleep、
join等方法,当他们收到中断请求或开始执行时,发现某个已经被设置好的中断状态,则抛出异常interruptedException。

每个线程都有一个boolean类型的中断状态。当调用Thread.interrupt方法时,该值被设置为true,Thread.interruptted可以恢复中断。

阻塞库方法,例如sleep和wait、join都会检查中断,并且发现中断则提前返回,他们会清楚中断状态,并抛出InterruptedException。

但是对于其他方法interrupt仅仅是传递了中断的请求消息,并不会使线程中断,需要由线程在下一个合适的时刻中断自己。

通常,用中断是取消的最合理的实现方式。

上面的例子的改进方法就是

public class PrimeProducer extends Thread {
    private final BlockingQueue<BigInteger> queue;

    PrimeProducer(BlockingQueue<BigInteger> queue) {        this.queue = queue;
    }    public void run() {        try {
            BigInteger p = BigInteger.ONE;            while (!Thread.currentThread().isInterrupted())                queue.put(p = p.nextProbablePrime());
        } catch (InterruptedException consumed) {            /* Allow thread to exit */
        }
    }    public void cancel() {
        interrupt();
    }
}

7.1.2 中断策略

发生了中断,需要尽快退出执行流程,并把中断信息传递给调用者,从而使调用栈中的上层代码可以采取进一步的操作。当然任务也可以不需要放弃所有操作,可以推迟处理中断清楚,知道某个时机。

7.1.3 响应中断

  • 传递异常

  • 回复中断状态

public class NoncancelableTask {    public Task getNextTask(BlockingQueue<Task> queue) {        boolean interrupted = false;        try {            while (true) {                try {                    return queue.take();
                } catch (InterruptedException e) {
                    interrupted = true;                    // fall through and retry
                }
            }
        } finally {            if (interrupted)
                Thread.currentThread().interrupt();
        }
    }    interface Task {
    }
}

7.1.6 处理不可中断的阻塞

例如Socket I/O或者内置锁都不能响应中断,这时候该如何做才能终止他们呢?可以通过重写Thread.interrupt方法,例如加入close的逻辑。

7.2 停止基于线程的服务

7.2.1 示例:日志服务

7.2.2 关闭ExecutorService

7.2.3 Poison Pill

例如CloseEvent机制或者POISON对象,来做特殊的识别,从而让程序自己处理停止操作,退出线程。

7.3 处理非正常的线程终止

7.4 JVM关闭

第8章 线程池的使用

一个很好的ThreadPoolExecutor源码分析文档

ThreadPoolExecutor UML图:

5bd464f900018daf09200635.jpg

image


5bd464f90001cb0009200690.jpg

image


5bd464fa0001204907640380.jpg

image



作者:芥末无疆sss
链接:https://www.jianshu.com/p/57c339fa0f0f
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專(zhuān)欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消