复习 - 并发 - 设计模式

1.模式之两阶段终止

在一个线程 T1 中怎样 等线程T2料理后事后,才杀死T2?

不可采取:

  • 使用线程对象的 stop() 方法停止线程:

    • stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁,其它线程将永远无法获取锁
  • 使用 System.exit(int) 方法停止线程

    • 会让整个程序都停止

思路:
image

public class TPTInterrupt {
    Logger log = Logger.getLogger("info");
    private Thread thread;

    public void start() {
        thread = new Thread(() -> {
            while (true) {
                // 获取当前正在执行的线程
                Thread current = Thread.currentThread();
                // 判断当前线程有无被打断(即打断标识 = true表示被打断了,料理后事)
                if (current.isInterrupted()) {
                    // 阻塞被打断时为false,我们只需要捕获异常,然后设置为true就行
                    log.info("料理后事");
                    break;
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // 如果在阻塞时被打断,则会抛出异常,且打断标识为false
                    // 我们只需要重置打断标识为true,则下次进入循环时会直接退出
                    current.interrupt();
                }
                // TODO 监控
            }
        }, "监控");

        thread.start();
    }

    public void stop() {
        thread.interrupt();
    }

    @Test
    public void test01() throws InterruptedException {
        TPTInterrupt t =new TPTInterrupt();
        t.start();
        Thread.sleep(3500);
        t.stop();
    }
}

2. 同步模式之保护性暂停

1.定义

用在一个线程等待另一个线程的执行结果

2.要点

  • 有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject
  • 如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)
  • JDK 中,join 的实现、Future 的实现,采用的就是此模式
  • 因为要等待另一方的结果,因此归类到同步模式

posted @   原来人生只有十二集  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示