Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程从运行函数返回值/数据_Java_Multithreading - Fatal编程技术网

Java线程从运行函数返回值/数据

Java线程从运行函数返回值/数据,java,multithreading,Java,Multithreading,我有一个疑问。如果我们谈论Java多线程,不包括并发框架,那么我们如何从run()方法返回一个值 我在一次采访中被问到这个问题,有人问我如何在不使用可调用或并发框架的情况下做到这一点,即如何告诉主线程Thread1已经完成了一些执行(run()completed),并且您可以更新UI 编辑:这与标记为重复的问题不同,当前的问题是关于如何使用runnable返回值进行设计/编码。根据run()函数,这是不可能的,但问题是如何通过runnable代码实现此行为,以便通知/更新主线程 我想这是不同的问

我有一个疑问。如果我们谈论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;
    } 
}