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

标签 java multithreading java-8 executorservice scheduledexecutorservice

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

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

线程 2 - 两个数字相加

线程 3 - 两个数字相乘

线程 4 - 打印结果。

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

我们如何确定哪个线程先启动以及接下来同时启动哪些线程。最后执行的是哪个线程。

注意:如何在不使用线程 sleep 的情况下实现这一目标。一旦线程 1 完成,其他两个线程就会动态地自动启动。

最佳答案

首先,请阅读我对您最初的问题的评论 - 关于使用汽车钉钉子的问题。

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

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

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

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

然后,您的主例程负责创建信号量,并将它们传递给新线程,以便每个线程的 out 引用与 in 相同的信号量> 预计执行后续任务的线程。

<小时/>

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

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

关于Java - 使用执行器服务的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60028573/

相关文章:

java - 如何将DatagramPacket发送到多个IP地址?

java - ConcurrentHashMap 在递增其值时是否需要同步?

Java 流 : How to do an efficient "distinct and sort"?

methods - 如何将 Stream 操作参数添加到我的函数中?

java - PKCS7 在 Java 中验证数字签名

java - 尝试将 AddAll 添加到 MutableList 时出现不受支持的异常

windows - std::condition_variable notify_all 不会同时唤醒所有线程

C# 同步对象 - 具有写入访问器的重复代码

Java Stream 按 02 个字段分组并按 2 个 BigDecimal 字段的总和聚合

java - 具有多种有界类型的逗号或&符号?