gpt4 book ai didi

java - Runnable/Thread 可能的误解

转载 作者:行者123 更新时间:2023-12-02 00:03:54 25 4
gpt4 key购买 nike

不确定我是否正确理解了线程,有人可以告诉我在以下示例中我是对还是错:

class Task {
String taskName;
private Thread thread;
boolean isFinished;

public Task(String name){
taskName = name;
}

public void createTask(final Runnable r) {
thread = new Thread(r){
public void run(){
if(r != null) {
r.run();
isFinished = true;
}
}
};
thread.start();
}
}

我在应用程序中实际做的是将 isFinished 设置为 true,并有一个观察者,每当 isFinished确实做了一些事情。恐怕在我作为参数传递的 Runnable 中的所有代码实际终止之前,isFinished 设置为 true。

run 方法不是应该将我传递的代码放在一个单独的线程中并异步运行该代码吗?

最佳答案

关闭,但是您的新线程已经获得了要执行的可运行对象。您确实想给它一个运行 r.run() 方法然后设置 isFinished 的包装器。

更改:

public void createTask(final Runnable r) {
thread = new Thread(r){
public void run(){
if(r != null) {
r.run();
isFinished = true;
}
}
};
thread.start();
}

public void createTask(final Runnable r) {
thread = new Thread( new Runnable {
public void run(){
if(r != null) {
r.run();
isFinished = true;
}
}
});
thread.start();
}

如果我没有指出 isFinished 的线程不安全性,那就是我的失职。如果不添加同步,您将无法保证注意到线程何时完成。我建议您添加:

public synchronized boolean getIsFinished()
{
return isFinished;
}

public synchronized void setIsFinished(boolean finished)
{
isFinished = finished;
}

并使用这些方法来获取或设置 isFinished 标志。鉴于您在这里缺乏同步,您可能会看到其他线程安全的奇怪现象,具体取决于您的 r.run() 方法和其他“观察者”是否也在不同步的情况下共享数据。

关于java - Runnable/Thread 可能的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14286652/

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