【问题标题】:How to end threads in a specific order using join() /wait() /notify combination? [duplicate]如何使用 join() /wait() /notify 组合以特定顺序结束线程? [复制]
【发布时间】:2018-10-01 06:47:50
【问题描述】:

假设我有 3 个实现 Runnable 接口的线程,我使用以下语句启动它们。

t1.start();
t2.start(); 
t3.start();

有什么方法可以使用join()wait()notify() 组合使线程以 t3 、t2、t1 的顺序结束?

【问题讨论】:

  • 不清楚。线程通常会在其run 方法终止时终止。你到底想达到什么目的?
  • 鉴于线程是同时启动的,我需要一个工作代码,使线程使用 join/wait/notify 以上述顺序结束。
  • 这是您已经告诉我们的。我问你:你想解决什么问题?线程异步运行。那么,为什么要考虑排序,尤其是结束这些线程的命令呢?你的问题看起来像XY problem
  • 您可以通过多种方式执行此控制流。你想要一个生产者消费者模型吗?或者您可以使用信号量或倒计时锁存器?为什么你有3个线程?你需要5个线程吗?您需要什么样的控制,例如 t1 如何知道何时完成以及 t3 等。
  • 所以你要做的不是以特定的顺序结束,而是以特定的顺序开始

标签: java multithreading


【解决方案1】:

不,线程将根据其run() 方法实现内部发生的情况而终止。如果您只是获得了一个当前正在运行的线程而无法访问它正在执行的代码,则无法强制它终止(除了调用stop()destroy(),它们都已弃用且不应使用)。

但是,如果您可以编写这些线程正在运行的代码,那就真的很简单了:

Thread t3 = new Thread(() -> { 
    System.out.println("Thread 3 terminating..."); 
});

Thread t2 = new Thread(() -> {
    try { t3.join(); } catch(InterruptedException e) {}; 
    System.out.println("Thread 2 terminating..."); 
});

Thread t1 = new Thread(() -> {
    try { t2.join(); } catch(InterruptedException e) {}; 
    System.out.println("Thread 1 terminating..."); 
});

t1.start();
t2.start(); 
t3.start();

【讨论】:

  • 但是一定要在你的run方法的末尾加入join,否​​则你只会阻塞一个线程直到其他线程完成,这里你不是要求线程完成,而是要求它们不要完成在别人之前..
  • 这行得通。谢谢。
【解决方案2】:

听起来你可能想要一个生产者消费者模型。

BlockingQueue<Callable<Boolean>> queue1 = new LinkedBlockingQueue<>();

Thread t1 = new Thread(()->{
   //do work.
   queue1.add(()-> someTask() );
   //do more work.
   queue1.add(()-> someTaskThatReturnsFalse() );
}).start();

Thread t2 = new Thread(()->{
     boolean shouldBeRunning = true;
     while(shouldBeRunning){

        Callable<Boolean> r = queue1.poll();
        shouldBeRunning = r.call();
     }
}).start();

您可以拥有任意数量的队列。还有其他使用锁和屏障的方法。这可以使用 join/wait/notify 来完成,但实际上您将重新创建 LinkedBlockingQueue

【讨论】:

  • 我不确定为什么这个答案没有用。从操作描述“......每个填充不同的结果”听起来完全像一个生产者。 “其他线程必须等到结果可用”听起来像是消费者。
猜你喜欢
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
相关资源
最近更新 更多