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

lit*_*leK 9 java methods multithreading return

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

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 Code Online (Sandbox Code Playgroud)

我需要run()方法来返回a ByteArrayOutputStream或a String.但是,因为它是在run()方法中Thread,我不能将方法的返回类型设置为a ByteArrayOutputStream或a String.

HttpRequestDispatcher班被称为所谓的OAuth.java类里面.

我怎样才能解决这种情况?

mik*_*iku 9

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

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

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

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

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


Bal*_*usC 7

让它实现Callable<T>而不是ThreadRunnable.这里T必须代表结果的类型.使用ExecutorService来执行它.它将返回结果的味道Future<V>.

这是一个带有as 的SSCCE,只是copy'n'paste'n'run它.StringT

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";
    }
}
Run Code Online (Sandbox Code Playgroud)