因此,我进行了测试,结果对我来说毫无意义。让我们考虑以下代码:
ThreadStuffCounter counter_1 = new ThreadStuffCounter(1);
while(counter_1.doProceed) {
Thread.sleep(500);
Thread thread = new Thread(counter_1);
thread.start();
}
用Runnable
如下:
package test;
public class ThreadStuffCounter implements Runnable {
public volatile boolean doProceed = true;
private int id = -1;
public volatile int i = -1;
public ThreadStuffCounter(int id) {
this.id = id;
}
@Override
public void run() {
for (i = 0; i < 10; i++) {
System.out.println("i = " + i + " in runnable id = " + id);
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
doProceed = false;
}
}
线程之间仅共享一个计数器实例。启动另一个线程所需的时间更少,然后对线程进行一个增量就可以了counter.doProceed
,据我所知,永远不要将其设置为false,并且循环应无限期地继续下去,直到遇到内存不足的异常并且无法启动任何更多线程为止。
循环如何退出?
编辑:修改代码,以确保下面的答案是正确的。
package test;
public class ThreadStuffCounter implements Runnable{
public volatile boolean doProceed = true;
private int id = -1;
volatile int i = -1;
public ThreadStuffCounter(int id){
this.id = id;
}
@Override
public void run() {
i = 0;
while (i < 10){
System.out.println("i = " + i + " in runnable id = " + id +
"; from thead id = " + Thread.currentThread().getId());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
}
ThreadStuff.doProceed = false;
}
}
和
package test;
public class ThreadStuff {
public static volatile boolean doProceed = true;
public static void main (String[] args) throws InterruptedException{
ThreadStuffCounter counter_1 = new ThreadStuffCounter(1);
while(doProceed){
Thread.sleep(500);
Thread thread = new Thread(counter_1);
thread.start();
}
}
}
同样,如果您要为i <n运行,则似乎需要n个线程。但是,您需要许多线程,以便n个线程同时增加。
当至少一个线程执行for
循环并且i
值大于或等于10时,doProceed
变量将为false
(是的,可能会发生),并且由于是volatile
这样,将停止执行while
创建和启动新线程的循环。然后,由所有线程来完成for
循环代码,然后完成它们的执行。这似乎是因为在您的环境中启动新线程的时间比当前线程完成其执行的时间慢。另外,请注意,几个线程可能会增加i
值,这将加速for
循环执行。
如果您循环到一个更高的值(未测试),则可能会生成一个无限循环,并且当没有足够的资源来创建和启动新线程时,应用程序将中断。
在使用限制10、50和1000进行了一些测试之后,我注意到当您拥有一个更大的值时,由于创建了许多线程,因此它们全部同时增加的值,i
并i
逐渐开始逐渐接近该限制。for
循环中设置的值。我当前环境的描述:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句