2 csh 34 csh_34 于 2013.03.04 13:11 提问

从线程中返回值的相关问题

程序的方法中有一个 HandlerThread。在线程中改变了一个值,然后我想把它返回到 test()方法。有什么方法能实现呢?

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

2个回答

Baby_Bonnie
Baby_Bonnie   2013.03.04 14:23
已采纳

你可以使用一个本地的 final 变量,变量需要是 non-primitive 类型,所以你可以使用一个数组。也需要同步两个线程,例如使用一个 CountDownLatch:

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

也可以使用 Executor 和 Callable:

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
    executor.shutdown();
}
yongyong_21
yongyong_21   2013.03.07 11:43

通常应该这样

public class Foo extends Runnable {
     private volatile int value;

     @Override
     public void run() {
        value = 2;
     }

     public int getValue() {
         return value;
     }
 }

然后你可以创建线程,检索值(鉴于已设置的值)

Thread t = new Thread(new Foo());
t.start();
// ... 
int value = t.getValue();
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!