Java:从线程获取值。。。?

Java:从线程获取值。。。?,java,multithreading,Java,Multithreading,如何从thead返回变量(我也有线程句柄)。在这种情况下,静态变量不起作用 更新:这里有一个转折点,我如何在不阻塞并等待结果的情况下执行此操作?我需要能够轮询创建的线程,如果它挂起的时间太长(例如>1分钟),则将其杀死,然后如果生成的线程占用的时间太长,则继续在主线程中执行。使用而不是线程(或可运行),以便您可以将结果作为并使用来调用它 这里有一个,复制粘贴运行它: package com.stackoverflow.q2413389; import java.util.Arrays; imp

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

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

使用而不是
线程
(或
可运行
),以便您可以将结果作为并使用来调用它

这里有一个,复制粘贴运行它:

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

}

如果我理解您的问题(如何访问线程对象的成员值),您可以使用以下简单方法:

MyObject a=新的MyObject();
新线程(a.start()

只需记住为MyObject实现可运行接口并使用适当的getter即可

如果要返回变量,可以在类中创建成员
然后执行一个while循环,直到线程完成执行。

这不会阻塞对吗?我还能投票吗?阅读API时,似乎在未来块上调用get。在较低级别上执行。你需要一个线程来收集任何方式的结果。你能补充一些解释吗?只是对这段代码解决的问题的一般性评论。我现在不可能运行这段代码,但它真的很有趣。只需“启动并忘记”一个简单的
线程,它反过来执行任务并收集结果。您可以保留一个句柄来进行轮询。@Roman:它返回结果,即
call()
方法的返回值,在本例中为“myResult”。结果类型可由参数化类型控制,在本例中,参数化类型仅为“普通”
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();