Java:从线程中获取值......?

Zom*_*ies 4 java multithreading

如何从thead返回变量(我也有线程处理).在这种情况下,静态变量不起作用.

更新:这是一个转折点,如何在不必阻塞并等待结果的情况下执行此操作?我需要能够轮询创建的线程并在它挂起太长时间(例如> 1分钟)时将其终止,然后如果生成的线程花费的时间太长则继续在主线程中.

Bal*_*usC 13

使用Callable<V>而不是Thread(或Runnable),以便您可以获得结果Future<V>并用于ExecutorService调用它.

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

package com.stackoverflow.q2413389;

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.newCachedThreadPool();
        List<Future<String>> results = executor.invokeAll(Arrays.asList(new Task()));
        for (Future<String> result : results) {
            System.out.println(result.get()); // Prints "myResult" after 2 seconds.
        }
        executor.shutdown();
    }

}

class Task implements Callable<String> {

    public String call() throws Exception {
        Thread.sleep(2000); // Do your running task here, this example lasts 2 seconds.
        return "myResult";
    }

}
Run Code Online (Sandbox Code Playgroud)

更新:根据您的更新,如何在超时后将其杀死,请ScheduledExecutorService改用.这是稍微改变的代码:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
List<Future<String>> results = executor.invokeAll(Arrays.asList(new Task()), 1, TimeUnit.SECONDS); // Timeout of 1 second.
for (Future<String> result : results) {
    if (!result.isCancelled()) {
        System.out.println(result.get()); // Won't be printed as the "actual" processing took 2 seconds.
    } else {
        System.out.println("Task timed out.");
    }
}
executor.shutdown();
Run Code Online (Sandbox Code Playgroud)