Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用volatile或原子布尔停止可运行线程的问题_Java_Multithreading - Fatal编程技术网

Java 使用volatile或原子布尔停止可运行线程的问题

Java 使用volatile或原子布尔停止可运行线程的问题,java,multithreading,Java,Multithreading,我试图使用volatile变量或原子变量停止正在运行的线程。但我对此有些怀疑。下面是我试过的代码 public class DemoThread { class DemoRunnable implements Runnable { private String name; public volatile boolean isRunning = true; public DemoRunnable() { } public DemoRunnable(S

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

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();
        }
    }

}
公共类降级线程{
类DemoRunnable实现Runnable{
私有字符串名称;
public volatile boolean isRunning=true;
公共可拆卸(){
}
公共可拆卸(字符串名称){
this.name=名称;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共同步布尔值正在运行(){
返回正在运行;
}
公共同步的void setRunning(布尔值isRunning){
this.isRunning=isRunning;
}
@凌驾
公开募捐{
System.out.println(“可运行…”+名称+“正在运行”
+i运行);
同时(正在运行){
int i;
对于(i=0;i<100;i++){
System.out.println(“----------------------->i”+i
+“名称”+名称+“正在运行”+正在运行);
}
//如果(i>0){
//System.out.println(“易失性不工作”);
//抛出新的运行时异常(“volatile not working”+name);
// }
}
System.out.println(“运行方法结束…”+正在运行);
}
}
私有void demoStop(整数计数){
DemoRunnable1=新的可拆卸(“+计数);
线程t1=新线程(runnable1);
螺纹t2=新螺纹(runnable1);
t1.start();
t2.start();
runnable1.isRunning=false;
//runnable1.setRunning(false);
}
公共静态void main(字符串[]args){
demohread demohread=新的demohread();
对于(int i=0;i<200;i++){
试一试{
demohread.demoStop(i);
}捕获(例外e){
e、 printStackTrace();
}
}
}
}

Wile执行上述代码时,有时包含while循环的run方法已执行多次。一旦ISSTOCKED设置为false,有没有办法停止while循环的运行

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


和原子布尔,以及我尝试过的isStop变量上的同步方法,但结果相同。

如果您的可运行检查被中断,中断()将按预期停止读取

    @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()比lame boolean标志要好得多。有关更多详细信息,请参阅ExecutorService和Future。

您的代码实际上可以工作。启动
t1.start()
,循环可以在
runnable1.isRunning=false之前执行多次在主线程中设置。你想做什么?由于
isRunning
标志是不稳定的,所以
isRunning()
setRunning()
方法不需要进行
同步化,我没有使用setRunning方法。Piotr Gwiazda:一旦isRunning为false,我需要从运行方法中的while循环中出来。我不想在while循环中继续。中断不会停止正在运行的线程。若线程进入睡眠或等待状态,则只会抛出中断的异常。遗嘱执行人服务我没有检查,我会检查并邮寄。当然不会。但是上面的示例中的循环将被忽略。我的意思是,这段代码在您也在executor服务中运行时的行为相同,然后在将来的对象上调用cancel。