gpt4 book ai didi

Java - 停止具有共享对象的线程

转载 作者:行者123 更新时间:2023-11-30 08:18:30 25 4
gpt4 key购买 nike

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

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

如果共享对象的属性为“true”,则线程处于忙碌等待状态。

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

谁能给我解释一下吗? :)

主要

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

最佳答案

更改共享对象

来自:

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 ,那么第二个选择是使用同步

关于Java - 停止具有共享对象的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29319804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com