【发布时间】:2018-07-12 21:37:51
【问题描述】:
我正在学习 Java 中的多线程,并且正在尝试使用线程。我想出了一种赛车条件代码(有点……原谅这个菜鸟),其中 2 个线程循环工作(100 次)并竞相更改静态变量。目标是当线程首先完成循环(在时间片环境中运行或并行运行)时,打印变量的值并调用 system.exit(int status) 来终止程序!这是为了找出哪个线程赢得了比赛!
预期的输出应该是:nameOfTheThreadThatWonTheRace + "--" + valueOf'I'IncrementedInTheLoop
代码如下:
public class Nest
{
public static void main(String[] args) throws Exception
{
Thread r1 = new Thread(new Racer(),"R1");
Thread r2 = new Thread(new Racer(),"R2");
r1.start();
r2.start();
}
}
class Racer implements Runnable
{
public void run()
{
for(int i = 0; i <= 100; i++)
{
Value.value = Thread.currentThread().getName() + "--" + i;
}
Value.printValue();
System.exit(0);
}
}
class Value
{
static String value = null;
public static void printValue()
{
System.out.println(value);
}
}
但实际输出不同(4 次运行):
R2--100 R2--100
R2--84 R2--100
R1--100 R1--100
R2--39 R2--100
我不知道为什么在任何一个线程到达“System.exit(0)”行后 JVM 没有停止? exit() 是否只关闭主线程或整个 JVM 还是仍在执行的线程正在阻止 JVM 停止?
另外请解释一下为什么要生产2行o/p?
For extra info:
Processor--> Intel® Core™ i5-7200U CPU @ 2.50GHz × 4
Ram--> 8GB
OS--> Fed27 workstation
(我还没有接触过 java.util.concurrent API,但我知道我可以在那里以不同的方式管理线程..)
如果您能用普通的线程术语解释而不是参考并发 API,我将不胜感激。
感谢您的帮助,再次原谅这个菜鸟:)
【问题讨论】:
-
我没有阅读所有代码,但它完全是线程不安全,所以......你遇到的任何惊喜都是因为这个。阅读一些关于多线程编程的教程,你会没事的。
-
我知道它不是线程安全的......这实际上是预期的行为(我猜)但我想知道为什么 System.exit() 不起作用......
-
您能否再解释一下并提及您期望的确切输出?实际输出有什么问题?根据您的程序,它们似乎是正确的。
-
System.exit()工作正常。是你的代码被破坏了,你的期望是错误的,所以对它的输出感到疑惑并不是很有用。 -
我期望的 o/p 是首先完成循环的线程应该打印出“值”,并且无论其他线程如何,程序都应该在该点终止......如果我的程序是错了......你能帮我纠正它以获得预期的结果吗?否则任何其他指针都会有帮助
标签: java multithreading jvm java-threads system.exit