【发布时间】:2015-04-13 16:32:46
【问题描述】:
public class MainClass {
public static void main(String args[]){
NewThread ob1 = new NewThread("One");
NewThread ob2 = new NewThread("Two");
NewThread ob3 = new NewThread("Three");
try{
System.out.println("Waiting for threads to finish.");
ob1.t.join();
ob2.t.join();
ob3.t.join();
} catch (InterruptedException e){
System.out.println("Main thread interrupted");
}
System.out.println("Exiting main thread.");
}
}
class NewThread implements Runnable {
Thread t;
NewThread(String name){
t = new Thread(this, name);
System.out.println("New thread: " + t);
t.start();
}
public void run(){
try{
for(int i=3; i>0; i--){
System.out.println(t.getName() + ": " + i);
Thread.sleep(1000);
}
} catch (InterruptedException e){
System.out.println(t.getName() + " interrupted.");
}
System.out.println("Exiting " + t.getName());
}
}
上面的代码是为了给出这个输出:
新线程:线程[One,5,main]
新线程:线程[Two,5,main]
新线程:线程[三,5,主]
正在等待线程完成。
一:3
二:3
三:3
一:2
二:2
三:2
一:1
二:1
三:1
退出一个
退出两个
退出三
退出主线程。
相反,它给出如下输出:
新线程:线程[One,5,main]
新线程:线程[Two,5,main]
一:3
新线程:线程[三,5,主]
二:3
正在等待线程完成。
三:3
三:2
一:2
二:2
三:1
二:1
一:1
退出两个
退出三
退出一个
退出主线程。
请帮我更正代码。
【问题讨论】:
-
您为什么希望它们按这个顺序排列?启动多个线程的全部意义不在于它们可以异步进行工作吗?
-
同上:如果您希望一系列事件以特定顺序发生,请编写代码在单个线程中按该顺序执行它们。每个多线程程序都需要在线程之间进行一些同步,但是您使用的同步越多,您从多个线程中获得的好处就越少。多线程编程的真正挑战是想出一个不依赖于线程之间紧密耦合的问题的解决方案。
-
P.S.;
Thread.sleep(t)可以用于演示和实验,但你不应该依赖它作为同步线程的手段。超时参数t只是调用实际需要多长时间的下限,并且在加载的系统上,实际的睡眠时间可能是不可预测的。Thread.sleep()是一个原始操作,旨在用于更高级别的类(例如 ScheduledThreadPoolExecutor),用于调度周期性事件、延迟事件、警报等。 -
如果您解释了为什么您认为这是一个问题,这将有所帮助。例如,您认为是什么原因导致
Exiting One必须在Exiting Two之前打印?代码在哪里反映了这种意图?
标签: java multithreading