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

Java - Thread using executor service

我正在 java 学习执行服务。 要求是使用执行程序服务创建 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().

创建第二个条件

在调用awaitsignal/signalAll.

之前必须先锁定锁

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

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

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

线程也可以互相启动:

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

[免责声明]

如果您使用 ExecutorService,您可能无法直接与线程交互。 This post 可能会帮助你加入,await/signal 应该不会更困难,如果需要,线程也可以将任务调度到线程池。

首先,请阅读我对您的原始问题的评论——关于用汽车敲钉子的问题。

好的,现在,@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 更优雅,因为如果你的老师下周要求你通过在序列中间添加另一个步骤来修改你的程序,那么 none 你写的现有任务将不得不改变。您只需编写新任务并更改 main() 例程中的两三行。

听起来并没有太大的改进,而且选项 2 显然比选项 1 更需要首先设置,但如果您受雇于拥有数百万个的企业级软件系统代码行,你会体会到选项2的美妙之处。