我是线程的新手,我有一个执行线程的类。该线程类有一个变量“errors”,将在其结束时设置。之后我需要在主线程中访问该变量。怎么可能呢?请帮帮我。以下是我的摘录。
public class ThreadSample {
public static void main(String args[]) {
new ThreadSample().threadExample();
// Need to access errors variable here
}
public void threadExample() {
MyThread m1 = new MyThread();
}
}
class MyThread extends Thread {
String errors ;
MyThread() {
start();
}
public void run() {
// my code goes here
}
}
感谢。
答案 0 :(得分:2)
修改强>
如果您正在加入该线程(即等待它完成),那么您之后就可以访问错误,主线程的内存将由Java thread API同步:
public String threadExample() {
MyThread m1 = new MyThread();
// I would not start in the thread constructor
m1.start();
m1.join();
return m1.errors;
}
如果要在线程仍在运行时访问errors变量,则有几个选项。您可以标记变量volatile
,这意味着所有线程都可以看到更改:
volatile String errors;
传递对象的其他方法是使用AtomicReference
来设置和获取有问题的对象,或者使用synchronized
关键字来确保后台线程的错误值与主要内容同步线。 @ claesv的答案就是一个很好的例子。
答案 1 :(得分:1)
我假设您知道如何从其他类中读取属性(直接或间接),因此我将在此处定位多线程问题。
首先,从不同线程访问字段时,通常需要同步该访问权限以确保所有线程都看到相同的状态:
public void run() {
longOperation();
synchronized (this) {
errors = "some message";
}
}
然后还为MyThread添加一个方法来读取错误字段:
public String getErrors() {
synchronized (this) {
return errors;
}
}
然后,在你的主要课程中,你只是:
MyThread m1 = new MyThread();
doSomeStuffWhileWaitingForLongOperation();
m1.join(); // wait for operation to finish before reading errors
String errors = m1.getErrors();
doSomethingWith(errors);