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