Java 我想开始10个线程。主线程启动第一个线程,第一个线程启动第二个线程,以此类推,最多10个线程,但不是10个线程,而是创建了19个线程

Java 我想开始10个线程。主线程启动第一个线程,第一个线程启动第二个线程,以此类推,最多10个线程,但不是10个线程,而是创建了19个线程,java,multithreading,Java,Multithreading,} 实际上,我不应该增加threadNumber,但如果我不增加,它将进入一个无限循环,如果我增加了19个线程,而不是10个,则是threadNumber++导致重复线程启动。 如果使用新线程(threads[this.threadNumber+1]).start()(并移除threadNumber++)仅启动10个 让我们检查一下逻辑: class MyRunnable implements Runnable { int threadNumber; MyRunnable[] t

}


实际上,我不应该增加threadNumber,但如果我不增加,它将进入一个无限循环,如果我增加了19个线程,而不是10个,则是
threadNumber++
导致重复线程启动。 如果使用
新线程(threads[this.threadNumber+1]).start()(并移除
threadNumber++
)仅启动10个

让我们检查一下逻辑:

class MyRunnable implements Runnable {
    int threadNumber;
    MyRunnable[] threads;

    public MyRunnable(int threadNumber, MyRunnable[] threads) {
        this.threadNumber = threadNumber;
        this.threads = threads;
    }

    public void run() {
    synchronized (this) {
        if(this.threadNumber!=10)
            new Thread(threads[this.threadNumber]).start();
            this.threadNumber++;
    }
    System.out.println("the thread " + Thread.currentThread().getName() + " with num " + this.threadNumber);
}

因此,除了最后一个线程(其中
10!=10
返回false)之外,每个线程都会重新启动一次,总共有19个线程。

threadNumber是每个MyRunnable实例中的一个字段,因此增加它对不同的线程/runnable没有任何影响。@Robert是的,不同的。但是,当您再次运行相同的runnable时,我的回答中描述了一个明显的效果。
class MyRunnable implements Runnable {
    int threadNumber;
    MyRunnable[] threads;

    public MyRunnable(int threadNumber, MyRunnable[] threads) {
        this.threadNumber = threadNumber;
        this.threads = threads;
    }

    public void run() {
    synchronized (this) {
        if(this.threadNumber!=10)
            new Thread(threads[this.threadNumber]).start();
            this.threadNumber++;
    }
    System.out.println("the thread " + Thread.currentThread().getName() + " with num " + this.threadNumber);
}
new Thread(threads[0]).start();  // Start the first thread

// Inside the first thread's run
if(0 != 10)
    new Thread(threads[0]).start(); // Oh noes, we restarted the first thread/runnable
this.threadNumber++; // We restarted the thread, AND incremented its threadnumber!

// Inside the first runnable's run AGAIN!
if(1 != 10)
    new Thread(threads[1]).start(); // NOW we started the second thread
this.threadNumber++; // First thread's threadnumber is now 2, but we didn't restart it so it won't run again