Java线程从运行函数返回值/数据
我有一个疑问。如果我们谈论Java多线程,不包括并发框架,那么我们如何从run()方法返回一个值 我在一次采访中被问到这个问题,有人问我如何在不使用可调用或并发框架的情况下做到这一点,即如何告诉主线程Thread1已经完成了一些执行(run()completed),并且您可以更新UI 编辑:这与标记为重复的问题不同,当前的问题是关于如何使用runnable返回值进行设计/编码。根据run()函数,这是不可能的,但问题是如何通过runnable代码实现此行为,以便通知/更新主线程Java线程从运行函数返回值/数据,java,multithreading,Java,Multithreading,我有一个疑问。如果我们谈论Java多线程,不包括并发框架,那么我们如何从run()方法返回一个值 我在一次采访中被问到这个问题,有人问我如何在不使用可调用或并发框架的情况下做到这一点,即如何告诉主线程Thread1已经完成了一些执行(run()completed),并且您可以更新UI 编辑:这与标记为重复的问题不同,当前的问题是关于如何使用runnable返回值进行设计/编码。根据run()函数,这是不可能的,但问题是如何通过runnable代码实现此行为,以便通知/更新主线程 我想这是不同的问
我想这是不同的问题。如果我错了,请纠正我。一种方法是在线程中设置一个值,等待线程结束,然后获取该值。这是一个简单的、不是很好的编码示例,但您可以直接执行它。请注意使用相同对象(
thread
)的synchronized
块
提示:run()是一个实例方法。你的线程不仅仅调用run(),它还调用某个对象的run()方法。你的意思是如果我们改变这个对象的变量来共享数据?但问题是如何告诉主线程ThreadT1已经完成,数据现在已经更新?主线程可以连接另一个线程。如果有一个线程t,那么t.join()将不会返回,直到t中的run()方法返回。@James,但我不想加入主线程。我想通知主线程事件X已经完成,现在您可以更新UI。(考虑它像OnPixExcReTo()),它运行在doIbEnLead()完成之后。您说,“从Run()方法返回一个值。”嗯,当一个线程的Run()方法返回时,线程就完成了。我假设您正在询问一种方法,以概括方法调用和跨线程边界返回的思想。有许多方法可以在连续运行的线程之间来回传递值。最通用、最流行的方法之一是使用队列(例如,任何实现java.util.Queue的类)。嗨,Thomas,这将通知所有等待的线程,但是通知主线程呢?我希望主线程在ThreadT1完成后得到通知。正如您在我的示例中所看到的,我只创建一个线程并在主线程中等待它。所以它死了,通知主线程。
public class Test {
private int result;
public static void main( String[] args) throws InterruptedException {
new Test().runTest();
}
private void runTest() throws InterruptedException {
Thread thread = new Thread() {
public void run() {
System.out.println("Thread starts");
try {
// some long operation in your thread
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread ends");
// set the value you want to "produce" with your thread
setResult(42);
// notify waiting threads
synchronized (this) {
notify();
}
}
};
// start your thread
thread.start();
// wait for it
synchronized (thread) {
thread.wait();
}
// now you got your result
System.out.println("result = " + result);
}
void setResult(int value) {
this.result = value;
}
}