java - 线程完成工作后如何返回值?

标签 java multithreading

假设我们有一个简单的例子:

public Example extends Thread{

    String temp;    

    public Example(){
    }

    @Override
    public void run(){
        .
        .
        .
        .
        temp = "a_value";
    }

    public static void main(String[] args) {

        Example th = new Example();
        th.start();
    }

}

线程完成工作后如何将字符串临时返回给我?

最佳答案

利用(相对)新的 Callable<T> 而不是 Runnable(在 1.5 和更新版本中可用):

这是一个(简单的)示例:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;


public class Main {

    public static void main(final String[] argv) {
        final ExecutorService service;
        final Future<String>  task;

        service = Executors.newFixedThreadPool(1);        
        task    = service.submit(new Foo());

        try {
            final String str;

            // waits the 10 seconds for the Callable.call to finish.
            str = task.get(); // this raises ExecutionException if thread dies
            System.out.println(str);
        } catch(final InterruptedException ex) {
            ex.printStackTrace();
        } catch(final ExecutionException ex) {
            ex.printStackTrace();
        }

        service.shutdownNow();
    }
}

class Foo implements Callable<String> {
    public String call() {
        try {
            // sleep for 10 seconds
            Thread.sleep(10 * 1000);
        } catch(final InterruptedException ex) {
            ex.printStackTrace();
        }

        return ("Hello, World!");
    }
}

关于java - 线程完成工作后如何返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3141158/

相关文章:

java - 互斥方法

java - "IllegalArgumentException: !utf8"大多数请求出现 Jetty 错误

java - 如何在 freemarker 中实现自定义计数器?

c++ - 通过引用将参数传递给 std::thread 函数是否安全?

java - 无法附加到 HDFS

c++ - 在 QDialog 中创建线程并向 Qt 中的 QDialog 发出信号

Java 的哈希表 - 如何获取任意条目

java - 嵌套 for 循环的时间和性能复杂度

python - 每次迭代在多个 CPU 上训练不同的 scikit-learn 分类器

c# - 具有动态 maxCount 的 SemaphoreSlim