【发布时间】:2019-03-29 16:00:04
【问题描述】:
我有两个不同的子进程在两个不同的线程中运行两个不同的命令。第二个线程更新静态变量中的值,第一个线程获取并使用该值。
流程应该是这样的:线程2更新静态变量,线程1从静态变量中获取值,然后打印出来。 但是发生的流程是 thread1 首先从静态变量中获取值。在这种情况下,它有一个 null 值,然后 thread2 更新该值。
两个线程并行运行,我正在使用 ExecutorService 类来执行此操作。 我正在使用 Runtime 类来运行命令,并使用 while 循环在两个线程上连续读取 Stream 的输出。
线程 1 不断给出 (X,Y) 值,线程 2 仅在获得文本时才给出值。
我得到的输出:
(12, 123) null --> thread2 没有得到任何值所以它不会更新,thread1 将从静态变量中得到 null
(123,334) null --> thread1 从静态变量中获取值并使用它,然后 thread2 将值“Hello”更新为静态变量
(134,654) "Hello" --> 线程 1 拾取 "Hello" 并使用它,然后线程 2 将值 "World" 更新为静态变量
预期输出:
(12, 123) null --> thread2 没有得到任何值所以它不会更新,thread1 将从静态变量中得到 null
(123,334) "Hello" --> thread2 将值 "Hello" 更新为静态变量,thread1 拾取并使用它
(134,654) "World" --> thread2 将值 "World" 更新为静态变量,thread1 将其拾取并使用它
我也使用了 volatile 变量,但输出没有改变。我在这里错过了什么?请帮忙...
【问题讨论】:
-
听起来你应该使用blockingQueue docs.oracle.com/javase/7/docs/api/java/util/concurrent/…
-
我也使用了 volatile 变量,但似乎 thread1 先运行,然后 thread2 运行......这就是 thread1 从变量中获取 null 然后 thread2 正在更新变量的原因。跨度>
-
似乎 thread1 先运行,然后 thread2 运行 - 正在做些什么来控制它?
-
@ScaryWombat 实际上什么都没有,我可以控制它如何让线程 2 先运行,然后线程 1 再运行,会解决我觉得的问题...
标签: java multithreading variables static runtime