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

标签 java multithreading

如何从 thead 返回一个变量(我也有线程句柄)。在这种情况下,静态变量将不起作用。

更新:这是一个转折点,我怎样才能做到这一点而不必阻塞并等待结果?我需要能够轮询创建的线程,如果它挂起的时间太长(例如 > 1 分钟),则将其杀死,然后如果生成的线程花费的时间太长,则继续在主线程中继续。

最佳答案

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

这是一个 SSCCE ,只需复制'n'粘贴'然后'运行它:

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";
    }

}

更新:根据关于如何在超时后终止它的问题的更新,使用 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();

关于Java:从线程中获取一个值...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2413389/

相关文章:

JavaFX WebView : Start Program, 输入数据、服务并显示本地 HTML -> 刷新数据 = 刷新 WebView

c++ - boost thread_group 将 unique_ptr 的所有权移动到线程

c++ - Linux/C++ 如何调试发布应用

java - 定期执行java程序

c++ - 如果我想制作分布式互斥库,我是否必须创建一个线程?

java - 如何从 Java 中的二维对象数组中提取数字

java - 合并包含列表的对象列表

java - 为什么 .toSet() 在 Java 中创建 Collection 不起作用?

java - 符号已定义。使用 JAXB 属性解决冲突

android - Android中进程、 Activity 、线程和任务之间的区别