Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用join()/wait()/notify组合按特定顺序结束线程?_Java_Multithreading - Fatal编程技术网

Java 如何使用join()/wait()/notify组合按特定顺序结束线程?

Java 如何使用join()/wait()/notify组合按特定顺序结束线程?,java,multithreading,Java,Multithreading,假设我有3个线程实现了一个可运行的接口,我已经用下面的语句启动了它们 t1.start(); t2.start(); t3.start(); 有没有任何方法可以使用join()、wait()、notify()组合使线程按t3、t2、t1的顺序结束?没有,线程将根据其run()方法实现内部发生的情况终止。如果您只获得了一个当前正在运行的线程,而没有任何对它正在执行的代码的访问权限,那么就没有办法强制它终止(除了调用stop()或destroy(),这两个线程都已弃用,不应使用) 但是,如果您可

假设我有3个线程实现了一个可运行的接口,我已经用下面的语句启动了它们

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

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

没有,线程将根据其
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();

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

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();
BlockingQueue queue1=新建LinkedBlockingQueue();
线程t1=新线程(()->{
//干活儿。
queue1.add(()->someTask());
//做更多的工作。
queue1.添加(()->someTaskThatReturnsFalse());
}).start();
线程t2=新线程(()->{
布尔值shouldBeRunning=true;
同时(应该运行){
可调用的r=queue1.poll();
shouldBeRunning=r.call();
}
}).start();

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

。线程通常在其
run
方法终止时终止。你到底想实现什么?鉴于线程是同时启动的,我需要一个工作代码,使线程使用join/wait/notify以所述顺序结束。这是你已经告诉我们的。我问你:你想解决什么问题?线程异步运行。那么,为什么要考虑一个命令,特别是关于结束那些线程的命令呢?您的问题看起来像一个控制流。您可以通过多种方式执行此控制流。你想要生产者-消费者模型吗?或者你可以使用信号灯或倒计时闩锁?为什么你有3个线程?你需要5根线吗?你需要什么样的控制,比如t1如何知道它何时完成,t3等等。所以你要做的不是以特定的顺序终止,而是以特定的顺序开始,但一定要在你的run方法的末尾放上连接,否则你只会阻塞一个线程,直到其他线程完成,这里你不是要求线程完成,但是你要求他们不要在别人之前完成这项工作。谢谢。我不知道为什么这个答案没有用。从ops的描述来看,“…每一个都填充了不同的结果”,听起来就像一个制作人。“其他线程必须等待结果可用”听起来像消费者。