【发布时间】:2016-05-24 20:30:40
【问题描述】:
我只是在测试一些线程,试图弄清楚如何使用它们。我的问题是,我怎样才能让我当前的场景按照我想要的方式工作?
我想让这个程序打印出 1 - 100。我有两种方法; oddNumbers 和 evenNumbers
oddNumbers:
public static void oddNumbers() {
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 1) {
System.out.println(i);
}
}
}
}).start();
}
evenNumbers:
public static void evenNumbers() {
new Thread(new Runnable() {
public void run() {
for (int q = 0; q < 100; q++) {
if (q % 2 == 0) {
System.out.println(q);
}
}
}
}).start();
}
main method
public static void main(String[] args) {
evenNumbers();
oddNumbers();
}
所以,据我了解,oddNumbers 和 evenNumbers 方法在不同的线程上运行。那么如果是,那为什么我的输出不是 1-100?
这是我得到的输出:
0
2
4
6
.
.
.
50
1
3
5
.
.
.
99
52
54
56
.
.
.
100
大约在evenNumbers 循环进行到一半时,oddNumbers 循环将其切断。为什么会发生这种情况,我该如何设置它才能打印 1-100?
提前致谢!
【问题讨论】:
-
好吧,偶数线程先于奇数线程启动……但即使它们同时开始,您为什么认为它们会交替出现?
-
与程序的实际执行时间相比,您的输出缓冲区更有可能填充并刷新到输出。加上时间戳,您可能会看到更多重叠。
-
让我想起:'一个程序员遇到了问题。他心想:“我知道了,我会用线来解决的!”。有现在的问题。两个他'
-
@Kaelinator “同一时间”是什么意思?线程可能在多核上同时运行,但 System.out.print 有一个同步块,用于序列化写入
-
@Kaelinator 好吧,就像我说的,你先启动一个线程——所以它会在另一个线程启动之前通过它的数字;然后另一个开始并“切断”第一个线程。
标签: java multithreading