首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从线程返回值

从线程返回值
EN

Stack Overflow用户
提问于 2012-02-05 19:36:08
回答 6查看 242.5K关注 0票数 106

我有一个带有HandlerThread的方法。在Thread中更改了一个值,我想将它返回给test()方法。有没有办法做到这一点?

public void test()
{   
    Thread uiThread = new HandlerThread("UIHandler"){
        public synchronized void run(){
            int value; 
            value = 2; //To be returned to test()
        }
    };
    uiThread.start();
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-02-05 19:51:32

您可以使用局部最终变量数组。该变量需要是非基元类型,因此可以使用数组。您还需要同步这两个线程,例如使用CountDownLatch

public void test()
{   
    final CountDownLatch latch = new CountDownLatch(1);
    final int[] value = new int[1];
    Thread uiThread = new HandlerThread("UIHandler"){
        @Override
        public void run(){
            value[0] = 2;
            latch.countDown(); // Release await() in the test thread.
        }
    };
    uiThread.start();
    latch.await(); // Wait for countDown() in the UI thread. Or could uiThread.join();
    // value[0] holds 2 at this point.
}

您还可以像这样使用ExecutorCallable

public void test() throws InterruptedException, ExecutionException
{   
    ExecutorService executor = Executors.newSingleThreadExecutor();
    Callable<Integer> callable = new Callable<Integer>() {
        @Override
        public Integer call() {
            return 2;
        }
    };
    Future<Integer> future = executor.submit(callable);
    // future.get() returns 2 or raises an exception if the thread dies, so safer
    executor.shutdown();
}
票数 84
EN

Stack Overflow用户

发布于 2012-02-05 19:46:36

您正在寻找的可能是代替RunnableCallable<V>接口,并使用Future<V>对象检索值,该对象也允许您等待直到计算出值为止。您可以通过从Executors.newSingleThreadExecutor()获得的ExecutorService来实现此目的。

public void test() {
    int x;
    ExecutorService es = Executors.newSingleThreadExecutor();
    Future<Integer> result = es.submit(new Callable<Integer>() {
        public Integer call() throws Exception {
            // the other thread
            return 2;
        }
    });
    try {
        x = result.get();
    } catch (Exception e) {
        // failed
    }
    es.shutdown();
}
票数 32
EN

Stack Overflow用户

发布于 2018-02-23 18:13:10

从Java8开始,我们有了CompletableFuture。就您的情况而言,您可以使用supplyAsync方法在执行后获取结果。

请找到一些参考here

    CompletableFuture<Integer> completableFuture
      = CompletableFuture.supplyAsync(() -> yourMethod());

   completableFuture.get() //gives you the value
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9148899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档