我正在学习java中的执行器服务。 要求是使用执行器服务创建 4 个线程 -
线程 1 - 获取两个数字作为输入。
线程 2 - 两个数字相加
线程 3 - 两个数字相乘
线程 4 - 打印结果。
线程1应该首先执行,线程1完成后线程2、3可以同时开始处理,最后一旦线程2、3完成。线程 4 最终应该运行。
我们如何确定哪个线程先启动以及接下来同时启动哪些线程。最后执行的是哪个线程。
注意:如何在不使用线程 sleep 的情况下实现这一目标。一旦线程 1 完成,其他两个线程就会动态地自动启动。
最佳答案
首先,请阅读我对您最初的问题的评论 - 关于使用汽车钉钉子的问题。
好的,现在,@dan1st 对于如何构建解决方案有了一些想法。还有两个。
使用全局
int
变量、全局锁
以及wait()
和notifyAll()
:让每个线程进入一个synchronized(lock)
block ,在该 block 中- 循环,调用
lock.wait()
直到全局int具有某个特定值, - 它的伎俩,
- 将全局 int 设置为将触发下一个线程的值,
- 调用
lock.notify()
,最后 - 退出
- 循环,调用
使用
Semaphore
:将两个Semaphore
实例传递给每个线程。称它们为in
和out
或类似的名称。拥有每个线程- 通过调用
in.acquire()
等待轮到, - 发挥它的作用,
- 调用
out.release()
, - 然后退出。
- 通过调用
然后,您的主例程负责创建信号量,并将它们传递给新线程,以便每个线程的 out
引用与 in
相同的信号量> 预计执行后续任务的线程。
IMO,选项 2 更优雅,因为如果您的老师要求您下周通过在序列中间添加另一个步骤来修改您的程序,那么您编写的现有任务都不会必须彻底改变。您只需要编写新任务并更改 main() 例程中的两到三行。
听起来并没有太大的改进,而且选项 2 显然比选项 1 需要更多的工作,但是如果您曾经受雇于具有数百万行代码的企业级软件系统,代码,您将开始欣赏选项 2 的美妙之处。
关于Java - 使用执行器服务的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60028573/