主线程何时死亡?
问题是使用线程生成1到99之间的随机数。 然而,这里的问题是我不知道“主线程停止”来自哪里? 主线不会死在最后?
这是示例输出:
Main thread stopping
Random no = 57
Random no = 47
Random no = 96
Random no = 25
Random no = 74
Random no = 15
Random no = 46
Random no = 90
Random no = 52
Random no = 97
Thread that generates random nos is stopping
Mythread课程:
public class MyThread extends Thread {
MyThread() {
// default constructor
}
MyThread(String threadName) {
super(threadName); // Initialize thread.
start();
}
public void run() {
// System.out.println(Thread.currentThread().getName());
Random rand = new Random();
int newValue;
for (int i = 0; i < 10; i++) {
newValue = rand.nextInt(99);// generates any vale between 1 to 99
System.out.println("Random no = " + newValue);
}
System.out.println("Thread that generates random nos is stopping");
}
}
主要课程:
public class HW5ex2a {
public static void main(String[] args) throws InterruptedException {
MyThread t = new MyThread();
t.start();
t.join();// wait for the thread t to die
System.out.println("Main thread stopping");
}
}
您不能依赖主线程和其他线程写入System.out的顺序。 你的线程执行正常,主线程等待它完成,然后主线程退出,如预期的那样。 但是这并不反映在System.out上看到的顺序。
要直接回答你的问题 - 主线程等待线程完成,那么它会向System.out写入一条消息,然后它就会死掉。 唯一令人困惑的是,由于您是从两个不同的线程写入System.out,因此您对相对排序没有任何保证。 来自两个不同线程的Println可以以任何方式显示交错......它恰好显示主线程的输出。
正如Alexis Leclerc指出的那样 - 你会得到一个不可预知的交错,就像在这个java线程教程中一样。
多核系统中的内存同步
由于两个线程都在不同的内核上运行(很可能),所以线程有权访问的对象由每个内核(在L1缓存中)进行缓存以提高性能。
每当对象的状态发生变化时,所有缓存都试图与RAM中的值同步,这不保证立即发生。
有些线程可能能够在其他线程之前进行同步,即使它们违反了它们之间的关系之前也是如此。
这背后的原因在于java内存模型的实现。
System.out
对象在这里也发生了同样的情况。
您不能保证数据通过和刷新的顺序。
因此它是不可预测的。 调用
System.out.flush();
可能会改善结果,但不能保证。
有关更多信息,请参阅Java中的使用System.out.println的多个线程
希望这可以帮助。
主线程退出如下情况: -
System.exit(1)
。 希望它能帮助你。
链接地址: http://www.djcxy.com/p/19399.html