Java - 使用共享对象停止线程

时间:2015-03-28 16:46:24

标签: java multithreading

我想使用共享对象来停止线程。 所以我写的代码很简单。

main 方法创建并启动线程,然后等待800毫秒,之后将共享对象的属性设置为“false”。

如果共享对象的属性为“true”,则线程处于busywait中。

代码不起作用(发生无限循环),似乎存在一个我无法解释的互斥问题,线程只能读取该属性。

有人可以向我解释一下吗? :)

主要

public class SharedResThreadExt {
public static void main(String args[]) {
    BodyThread[] my_threads = new BodyThread[5];               

    SharedRsrc sh_resource = new SharedRsrc(true);   // shared object dec and alloc

    for (int i = 0; i < my_threads.length; i++) {    // creation and start threads
        my_threads[i] = new BodyThread(sh_resource);         
        my_threads[i].start();
    }

    try{
        Thread.sleep(800);          // wait 800 millisec 
        sh_resource.setFlag(false);  //sets shared object attribute to false
    }
    catch(InterruptedException e){}
}
}

线程正文

class BodyThread extends Thread {                    
private SharedRsrc sr;        

public BodyThread(SharedRsrc sr){
    this.sr = sr;
}

@Override
public void run() {
    System.out.println("Thread: " + getId() + " starts exec.");
    while(sr.getFlag()){}              // busywait if shared object attributeis true  
    System.out.println("Thread: " + getId() + " stopped exec.");
}
}

共享对象

class SharedRsrc{
private boolean flag;

public SharedRsrc(boolean flag){
    this.flag = flag;
}
public boolean getFlag(){
    return this.flag;
}
public void setFlag(boolean flag){
    this.flag = flag;
} 
}

1 个答案:

答案 0 :(得分:1)

更改共享对象

发件人:

class SharedRsrc{
private boolean flag;

public SharedRsrc(boolean flag){
    this.flag = flag;
}
public boolean getFlag(){
    return this.flag;
}
public void setFlag(boolean flag){
    this.flag = flag;
} 
}

   class SharedRsrc{
   private volatile boolean flag;

    public SharedRsrc(boolean flag){
        this.flag = flag;
    }
    public boolean getFlag(){
        return this.flag;
    }
    public void setFlag(boolean flag){
        this.flag = flag;
    } 
    }

或者您可以直接在SharedResThreadExt中声明变量,如下所示。

private static volatile boolean flag= false;

如果您不想使用volatile,则第二个选项是使用synchronized