我正在用Java学习执行器服务。要求正在使用executor服务创建4个线程-
线程1-获得两个数字作为输入。
线程2-两个数字相加
线程3-两个数字相乘
线程4-打印结果。
应该先执行线程1,在线程1完成后,线程2、3可以同时开始处理,最后在线程2、3完成后才开始执行。线程4应该最终运行。
我们如何确定哪个线程首先启动,然后哪个线程同时启动。最后,最后执行哪个线程。
注意:如果不使用线程睡眠,我们如何实现这一目标。一旦线程1完成,就会动态地动态启动另外两个线程。
您可以使用多种方法执行此操作。
例如,加入:
一个线程可以加入另一个线程,这意味着它要等到另一个线程完成。线程2和3可以加入线程1,线程4可以加入线程2和3。
另一种可能性是await and signal,但我不确定它是否满足您的要求(它使用类似于Thread.sleep()
的方法:
首先,创建通用的java.util.concurrent.locks.Lock
并使用.newCondition()
创建此锁定的条件。还使用newCondition()
创建第二个条件。
在调用await
和signal
/ signalAll
之前,必须锁定该锁。
在启动之前,线程2和3在第一个条件下调用.await()
,完成时线程1在第一个条件下调用.signalAll
。
线程4在启动之前在第二种情况下调用.await()
。
最后完成的线程(2或3)(在第二个条件下调用.signal()
。最后完成的线程(该线程首先完成的逻辑应该与锁同步)。]
线程也可以彼此启动
:线程1在任务完成后启动线程2和3,但我建议您使用线程4的其他机制之一。
[免责声明
]如果使用ExecutorService
,您可能无法直接与线程进行交互。 This post可能会帮助您进行连接,等待/信号应该不会更困难,并且如果需要,线程也可以将任务计划到线程池中。
首先,请阅读我对您的原始问题的评论-有关使用汽车锤击钉子的问题。