繁体   English   中英

Java - 使用执行程序服务的线程

[英]Java - Thread using executor service

我正在学习 Java 中的执行程序服务。 要求是使用执行器服务创建 4 个线程 -

线程 1 - 获取两个数字作为输入。

线程 2 - 两个数相加

线程 3 - 两个数字的乘法

线程 4 - 打印结果。

线程 1 应该先执行,线程 1 完成后线程 2、3 可以同时开始处理,最后一次线程 2、3 完成。 线程 4 应该最终运行。

我们如何确定哪个线程先启动,哪个线程接下来同时启动。 最后执行哪个线程。

注意:我们如何在不使用线程睡眠的情况下实现这一点。 一旦线程 1 完成,其他两个线程应自动启动。

首先,阅读我对你最初问题的评论——关于用汽车敲钉子的问题。

好的,现在,@dan1st 对如何构建解决方案有了一些想法。 这里还有两个。

  1. 使用全局int变量、全局lock以及wait()notifyAll() :让每个线程进入一个synchronized(lock)块,其中

    • 循环,调用lock.wait()直到全局 int 具有某个特定值,
    • 它的伎俩,
    • 将全局 int 设置为将触发下一个线程的值,
    • 调用lock.notify() ,最后
    • 退出
  2. 使用Semaphores :将两个Semaphore实例传递给每个线程。 叫他们inout或一些这样的名字。 拥有每个线程

    • 通过调用in.acquire()等待轮到它,
    • 做它的伎俩,
    • 调用out.release() ,
    • 然后退出。

然后,您的主程序负责创建的信号量,并将它们传递给新的线程,使得每个线程的out指的是同一个信号量的in ,预计将执行后续任务的线程。


IMO,选项 2 更优雅,因为如果您的老师要求您下周通过在序列中间添加另一个步骤来修改您的程序,那么您编写的任何现有任务都不必更改。 您只需要编写新任务并更改 main() 例程中的两三行。

听起来并没有太大的改进,而且选项 2 显然比选项 1 一开始要设置更多的工作,但是如果您曾经受雇在具有数百万行代码的企业级软件系统上工作,那么您将会体会到选项 2 的美妙之处。

您可以使用多种方式来做到这一点。

例如,加入

一个线程可以加入另一个线程,这意味着它会等待另一个线程完成。 线程 2 和 3 可以连接线程 1,线程 4 可以连接线程 2 和 3。

另一种可能性是await 和 signal但我不确定它是否满足您的要求(它使用类似于Thread.sleep()东西:

首先,您创建一个公共java.util.concurrent.locks.Lock并使用.newCondition()创建此锁的条件。您还使用newCondition()创建第二个条件。

在调用awaitsignal / signalAll之前必须锁定锁。

线程 2 和 3 在开始前在第一个条件下调用.await() ,线程 1 在完成时在第一个条件下调用.signalAll

线程 4 在启动之前在第二个条件下调用.await()

最后完成的线程(2 或 3)(线程首先完成的逻辑应该与锁同步.signal()在第二个条件下调用.signal()

线程也可以相互启动

线程 1 在任务完成后启动线程 2 和 3,但我会向您推荐线程 4 的其他机制之一。

[免责声明]

如果您使用ExecutorService您可能无法直接与线程交互。 这篇文章可能会帮助你加入,等待/信号应该不会更困难,如果需要,线程还可以将任务安排到线程池。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM