这个循环怎么能退出?

时间:2014-08-06 17:31:10

标签: java multithreading testing

所以,我进行了测试,结果对我没有任何意义。让我们考虑以下代码:

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&lt; ñ。你需要很多,所以n个线程同时增加。

1 个答案:

答案 0 :(得分:3)

当至少有一个线程执行for循环且i值大于或等于10时,doProceed变量将为false(是的,这个可能会发生),因为它volatile这将停止执行创建和启动新线程的while循环。然后,由所有线程决定是否完成执行for循环的代码,然后完成执行。这似乎是因为在您的环境中启动新线程的时间比当前线程完成执行的时间要慢。另请注意,多个线程可能会增加i值,这将加速for循环执行。

如果你循环到更高的值(未测试),那么这可能会产生一个无限循环,当没有足够的资源来创建和启动新线程时,应用程序将会中断。


使用限制为10,50和1000的一些测试之后。我注意到当你有一个更大的值,因为创建了很多线程,所有这些线程同时增加了i的值, i慢慢开始接近for循环中设置的限制值。我当前环境的描述:

  • 操作系统:Windows 7 Professional 64位
  • 处理器:Intel(R)Core(TM)i5-2520M CPU @ 2.50GHz(4个CPU),~2.5GHz
  • Ram:8192MB