加入不起作用(JAVA线程)

时间:2016-01-18 19:46:53

标签: java multithreading join

加入不起作用。我输错了。这是代码:

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()方法。

4 个答案:

答案 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!");
    }