class JoinDemo extends Thread {
JoinDemo(String nm) {
setName(nm);
start();
}
public void run() {
for (int i = 1; i <= 5; i++) {
try {
Thread.sleep(100);
} catch (Exception e) {
System.out.println(e);
}
System.out.println(i);
}
System.out.println(getName() + " exiting.");
}
public static void main(String args[]) {
JoinDemo t1 = new JoinDemo("One");
JoinDemo t2 = new JoinDemo("Two");
JoinDemo t3 = new JoinDemo("Three");
try {
t1.join();
} catch (Exception e) {
System.out.println(e);
}
System.out.println("Main Thread Exits now.");
}
}
获得的输出是:
1
1
1
2
2
2
3
3
3
4
4
4
5
5
Three exiting.
One exiting.
5
Main Thread Exiting
Two exiting.
我在浏览各种网站后编写了上述程序,以了解Join()的概念。但我仍然无法得到它。我面临的问题是我使用了t1.join()。所以线程一应该在三个之前退出,但是这里的三个线程在一个之前退出。每次运行程序时输出都不同。有时它会在一个之前退出,或者在一个之前退出三个。不应该在任何其他线程之前线程退出一个?当t1.join()等待线程1在三个和一个??
之前终止答案 0 :(得分:1)
不,你误解了join()
的效果。
当你执行t1.join()
时,你只是断言线程t1将在继续程序之前完成。
正如你所看到的那样,
One exiting.
5
Main Thread Exiting
在由Main Thread Exiting
符号化的主要结尾之前的一个出口。
如果你希望你的程序在完成之前完成所有线程,你应该这样做:
try {
t1.join();
t2.join();
t3.join();
} catch (Exception e) {
System.out.println(e);
}
如果你想要一个完成然后2然后3
JoinDemo t1 = new JoinDemo("One");
try {
t1.join();
} catch (Exception e) { System.out.println(e); }
JoinDemo t2 = new JoinDemo("Two");
try {
t2.join();
} catch (Exception e) { System.out.println(e); }
JoinDemo t3 = new JoinDemo("Three");
try {
t3.join();
} catch (Exception e) { System.out.println(e); }
答案 1 :(得分:0)
要确切知道join()正在做什么,
JoinDemo t1=new JoinDemo("One");
t1.join();
JoinDemo t2=new JoinDemo("Two");
JoinDemo t3=new JoinDemo("Three");
在声明t1之后调用该方法并查看。
join()
方法将使已经初始化的线程首先完成。所以其他Threads
将等到那时。
答案 2 :(得分:0)
t1.join()
只是确保您的主线程会阻塞,直到t1
完成。与其他两个线程相比,您无法控制t1
完成的速度。
t1
,t2
和t3
受线程调度程序的支配。您的代码中唯一的保证是t1
将在主线程之前完成。
答案 3 :(得分:0)
您正在运行3个不同的主题。每个线程使用的CPU的优先级或数量取决于java实现,在某些情况下,它由操作系统完成。这就是你获得不同输出的原因。 连接使正在运行的线程等到关节线程死亡。
我想你想要这个输出:
class JoinDemo extends Thread {
JoinDemo(String nm) {
setName(nm);
}
public void run() {
for (int i = 1; i <= 5; i++) {
try {
Thread.sleep(100);
} catch (Exception e) {
System.out.println(e);
}
System.out.println(i);
}
System.out.println(getName() + " exiting.");
}
public static void main(String args[]) {
JoinDemo t1 = new JoinDemo("One");
JoinDemo t2 = new JoinDemo("Two");
JoinDemo t3 = new JoinDemo("Three");
try {
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
t3.join();
} catch (Exception e) {
System.out.println(e);
}
System.out.println("Main Thread Exits now.");
}
}