我想使用共享对象来停止线程。 所以我写的代码很简单。
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;
}
}
答案 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