Java 为什么线程不工作?

Java 为什么线程不工作?,java,multithreading,Java,Multithreading,以下是我的代码: private int counter = 0; public void incC() { counter++; System.out.println("Counter is: "+counter + " "+Thread.currentThread().getName()); } public void printC() { System.out.println("Counter is: "+counter + " "+Thread.cu

以下是我的代码:

private int counter = 0;

public void incC() {
    counter++;
    System.out.println("Counter is: "+counter +  "  "+Thread.currentThread().getName());
}

public void printC() {
    System.out.println("Counter  is: "+counter +  "  "+Thread.currentThread().getName());
}

 public static void main(String args[]) throws Exception {
       Stuff stuff = new Stuff();

        Thread t1 = new Thread(() -> {
           stuff.incC();
       });

       Thread t2 = new Thread(() -> {
           stuff.printC();
       });

       t1.start();
       t2.start();

       t1.join();
       t2.join();
  }
}
以下是我的输出:

Counter  is: 1  Thread-1
Counter is: 1  Thread-0
  • 这里首先调用
    t1.join()
    。所以线程
    t2
    不应该等待线程
    t1
    死亡吗
  • 线程
    t2
    如何在
    t1
    之前首先输出
t1.join()
使当前线程等待线程
t1
死亡。它对除当前线程外的任何其他线程的计时都没有影响。您已经启动了两个线程,它们将在没有排序约束的情况下并发运行

我还应该注意到,启动两个线程只是为了让一个线程等待另一个线程的死亡,这违背了多线程的目的

  • join()
  • 线程的执行顺序不是固定的,因为它们是并行工作的

  • 两个线程并行工作,因此不能保证在您的情况下哪个线程将首先完成

    如果你想让一个特定的线程先完成,你必须启动它并将其与主线程连接,然后启动并连接第二个线程,如下所示

        t1.start();
        t1.join();
    
        t2.start();
        t2.join();
    
    为线程设置名称,以便更好地理解


    由于线程工作正常,请更改您的问题。

    否,
    join()
    使当前线程(本例中的“主”线程)等待
    t1
    t2
    完成。换句话说:线程工作正常。如果要等待
    t1
    的终止,然后启动
    t2
    ,则必须在
    t1.join()
    之后调用
    t2.start()
    …有什么问题吗?线程可能正在工作,您需要同步访问
    计数器
    我发现这些新手经常误解“当前线程”的含义。首先,当您有八个CPU都在启动时,哪个线程是“当前”线程?然后,再加上noob通常没有意识到主线程是线程这一事实。他们提出了这样的想法,当前线程就是“我”刚刚创建并开始的线程。我喜欢用这样的话来解释
    join()
    ,“
    t1.join()
    t1
    没有任何作用;它只是等待
    t1
    死亡。”