从一个线程检索值到另一个线程

时间:2012-02-23 15:19:21

标签: java multithreading

我是线程的新手,我有一个执行线程的类。该线程类有一个变量“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
    }
}

感谢。

2 个答案:

答案 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);