繁体   English   中英

使用易失性或原子布尔值停止可运行线程的问题

[英]issue with stopping runnable thread using volatile or atomic boolean

我试图使用volatile变量或atomic变量停止正在运行的线程。 但是我对此有些怀疑。 下面是我尝试的代码。

public class DemoThread {
class DemoRunnable implements Runnable {

    private String name;

    public volatile boolean isRunning = true;

    public DemoRunnable() {
    }

    public DemoRunnable(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public synchronized boolean isRunning() {
        return isRunning;
    }

    public synchronized void setRunning(boolean isRunning) {
        this.isRunning = isRunning;
    }

    @Override
    public void run() {

        System.out.println(" runnable ..." + name + " isRunning "
                + isRunning);

        while (isRunning) {
            int i;
            for (i = 0; i < 100; i++) {
                System.out.println("--------------------> i " + i
                        + " name " + name + " isRunning " + isRunning);
            }
            // if (i > 0) {
            // System.out.println(" volatile not working ");
            // throw new RuntimeException("volatile not working " + name);
            // }
        }
        System.out.println(" run method ends ..." + isRunning);
    }

}

private void demoStop(int count) {
    DemoRunnable runnable1 = new DemoRunnable("" + count);

    Thread t1 = new Thread(runnable1);
    Thread t2 = new Thread(runnable1);

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

    runnable1.isRunning = false;
    // runnable1.setRunning(false);

}

public static void main(String[] args) {
    DemoThread demoThread = new DemoThread();

    for (int i = 0; i < 200; i++) {
        try {
            demoThread.demoStop(i);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

}

有时在执行上面的代码时,有时会执行多次包含while循环的run方法。 一旦将isStopped设置为false,是否可以停止while循环运行?

线程的中断方法不会停止正在运行的方法。

我尝试过对isStop变量使用原子布尔和同步方法,但结果相同。

如果您的可运行检查为isInterrupted,则interrupt()将按预期停止读取。

    @Override
public void run() {
    while (!Thread.currentThread().isInterrupted()) {
        someTask();
        // thread can sleep if you like, add this block  
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            log.warn("Interrupted", e);
            break;
        }
    }
}

您的嵌套循环不会检查原子布尔值,并且自然不会停止。 无论如何,interrupt()比than脚的布尔标志好得多。 有关更多详细信息,请参见ExecutorService和Future。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM