需要帮助在线程运行方法中返回对象

时间:2010-02-19 23:57:57

标签: java multithreading methods return

我有一个扩展Thread的Java类,它基本上如下所示:

public class HttpRequestDispatcher extends Thread {
    private String url;
    private String method; // GET or POST
    private byte[] postData;

    public HttpRequestDispatcher(String url, String method, byte[] postData) {
        this.url = url;
        this.method = method;
        this.postData = postData;
    }

    public HttpRequestDispatcher(String url, String method) {
        this.url = url;
        this.method = method;
    }

    public void run() {
        ...
    }
}

我需要run()方法才能返回ByteArrayOutputStreamString。但是,因为它位于run()的{​​{1}}方法中,所以我无法将方法的返回类型设置为ThreadByteArrayOutputStream

String类在名为OAuth.java的类中调用。

我如何解决这种情况?

2 个答案:

答案 0 :(得分:9)

这个问题有几种解决方案:

  • 使用Thread外部的数据结构。传递构造函数中的对象并在线程即将完成时更新它。

  • 使用回调方法。线程完成后,请调用回调。

  • 使用java.util.concurrent.Future(Java> = 1.5):

      

    Future表示异步计算的结果。提供方法以检查计算是否完成,等待其完成,以及检索计算结果。

答案 1 :(得分:7)

让它实现Callable<T>而不是ThreadRunnable。此处T必须表示结果的类型。使用ExecutorService执行它。它将返回Future<V>的味道结果。

这是一个SSCCE StringT,只是复制'n'paste'n'run它。

package com.stackoverflow.q2300433;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Test {
    public static void main(String... args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new Task());
        System.out.println(future.get()); // Prints "result" after 2 secs.

        // Or if you have multiple tasks.
        // List<Future<String>> futures = executor.invokeAll(Arrays.asList(new Task()));
        // for (Future<String> future : futures) {
        //     System.out.println(future.get());
        // }

        executor.shutdown(); // Important!
    }
}

class Task implements Callable<String> {
    public String call() throws Exception {
        Thread.sleep(2000);
        return "result";
    }
}