加入不起作用。我输错了。这是代码:
package Test;
public class Test {
public static void main(String[] args){
System.out.println("Hello world!");
ThreadTest t1 = new ThreadTest("1");
ThreadTest t2 = new ThreadTest("2");
t1.start();
try{
t1.join();
System.out.println("OK!");
}catch( Exception e){
e.getMessage();
System.out.println("Fail!");
}
t2.start();
}
}
package Test;
public class ThreadTest extends Thread{
private Thread t;
private String name;
ThreadTest (String name){
this.name = name;
}
public void run(){
for(int i = 0; i<=10; i++){
System.out.println("Tread: " + name + " " + i);
}
}
public void start(){
if(t == null){
t = new Thread(this, name);
t.start();
}
}
}
我得到以下输出:
你好世界!
OK!
踏:1 0
胎面:1 1
胎面:1 2
踏:1 3
胎面:1 4
胎面:2 0
胎面:2 1
胎面:2 2
胎面:1 5
胎面:2 3
胎面:1 6
胎面:2 4
踏:1 7
胎面:2 5
胎面:1 8
胎面:2 6
踏:1 9
胎面:2 7
胎面:1 10
胎面:2 8
胎面:2 9
胎面:2 10
这是错的!线程2应该在线程1完成后开始,而不是介于两者之间,因为join()方法。
答案 0 :(得分:2)
其他答案告诉你的是你的程序创建了四个Thread实例,但它只使用其中两个作为线程。您加入的Thread实例是程序永远不会启动的两个实例之一。
您的一些困惑是由于您的Thread子类有一个名为start()
的方法,但该方法不会执行Thread.start()
所做的事情。
好的,这一切都很糟糕,但这是一个更深层次的问题:
问:这样做有什么意义:
Thread t = new Thread(...);
t.start();
t.join();
答:这样做有没有点。使用线程的重点--- 整个点 - 是当一个线程启动另一个线程时,第一个线程可以执行其他而新线程是运行:
Thread t = new Thread(...);
t.start();
doSomethingElse(...)
t.join();
答案 1 :(得分:0)
您没有加入Thread,而是加入ThreadTest对象。
方法start是创建一个新线程并启动它。
我建议在ThreadTest
中添加这样的方法并将其命名为:
public void joinThread(){
if(t != null){
t.join();
}
}
答案 2 :(得分:0)
您正在此方法中创建一个新线程
public void start(){
if(t == null){
t = new Thread(this, name);
t.start();
}
}
应该是这样的
public class ThreadTest extends Thread{
ThreadTest (String name){
super(name);
}
public void run(){
for(int i = 0; i<=10; i++){
System.out.println("Tread: " + getName() + " " + i);
}
}
}
答案 3 :(得分:-1)
//t.join (10000) add a value large, so that t1 job is over
try{
t1.join(10000);
System.out.println("OK!");
}catch( Exception e){
e.getMessage();
System.out.println("Fail!");
}