有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程联接不工作(JAVA线程)

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();
        }
    }
}

我得到以下输出:
你好,世界
好的
胎面花纹:10
胎面花纹:11
胎面花纹:12
胎面花纹:13
胎面花纹:14
胎面花纹:20
胎面花纹:21
胎面花纹:22
胎面花纹:15
胎面花纹:23
胎面花纹:16
胎面花纹:24
胎面花纹:17
胎面花纹:25
胎面花纹:18 胎面花纹:26
胎面花纹:19
胎面花纹:27
胎面花纹:110
胎面花纹:28
胎面花纹:29
胎面花纹:210

这是错误的!由于join()方法,线程2应该在线程1完成后启动,而不是在两者之间


共 (4) 个答案

  1. # 1 楼答案

    其他答案告诉您的是,您的程序创建了四个线程实例,但它只使用其中两个作为线程。您加入的线程实例是程序从未启动的两个线程实例之一

    部分混淆是由于线程子类有一个名为start()的方法,但该方法并不像Thread.start()那样做

    好吧,这很糟糕,但还有一个更深层次的问题:

    问:这样做有什么意义:

    Thread t = new Thread(...);
    t.start();
    t.join();
    

    答:这样做毫无意义。使用线程的意义在于,当一个线程启动另一个线程时,第一个线程可以在新线程运行时执行其他操作:

    Thread t = new Thread(...);
    t.start();
    doSomethingElse(...)
    t.join();
    
  2. # 2 楼答案

    您正在使用此方法创建一个新线程

    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. # 3 楼答案

    您不是在线程上连接,而是在对象ThreadTest上连接

    方法start是创建一个新线程并启动它

    我建议在ThreadTest中添加一个类似这样的方法并调用它:

    public void joinThread(){
        if(t != null){
            t.join();
        }
    }
    
  4. # 4 楼答案

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