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

程序的方法中有一个 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();
}


饮歌长啸
浏览 594回答 2
2回答

阿波罗的战车

你可以使用一个本地的 final 变量,变量需要是 non-primitive 类型,所以你可以使用一个数组。也需要同步两个线程,例如使用一个 CountDownLatch:public&nbsp;void&nbsp;test() {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;CountDownLatch&nbsp;latch&nbsp;=&nbsp;new&nbsp;CountDownLatch(1); &nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;int[]&nbsp;value&nbsp;=&nbsp;new&nbsp;int[1]; &nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;uiThread&nbsp;=&nbsp;new&nbsp;HandlerThread("UIHandler"){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;synchronized&nbsp;void&nbsp;run(){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value[0]&nbsp;=&nbsp;2; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;latch.countDown();&nbsp;//&nbsp;Release&nbsp;await()&nbsp;in&nbsp;the&nbsp;test&nbsp;thread. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;uiThread.start(); &nbsp;&nbsp;&nbsp;&nbsp;latch.await();&nbsp;//&nbsp;Wait&nbsp;for&nbsp;countDown()&nbsp;in&nbsp;the&nbsp;UI&nbsp;thread. &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;value[0]&nbsp;holds&nbsp;2&nbsp;at&nbsp;this&nbsp;point. }也可以使用 Executor 和 Callable:public&nbsp;void&nbsp;test()&nbsp;throws&nbsp;InterruptedException,&nbsp;ExecutionException {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;ExecutorService&nbsp;executor&nbsp;=&nbsp;Executors.newSingleThreadExecutor(); &nbsp;&nbsp;&nbsp;&nbsp;Callable<Integer>&nbsp;callable&nbsp;=&nbsp;new&nbsp;Callable<Integer>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Integer&nbsp;call()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;2; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;Future<Integer>&nbsp;future&nbsp;=&nbsp;executor.submit(callable); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;future.get()&nbsp;returns&nbsp;2 &nbsp;&nbsp;&nbsp;&nbsp;executor.shutdown(); }

米脂

通常应该这样public&nbsp;class&nbsp;Foo&nbsp;extends&nbsp;Runnable&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;volatile&nbsp;int&nbsp;value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;run()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;2; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getValue()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;}然后你可以创建线程,检索值(鉴于已设置的值)Thread&nbsp;t&nbsp;=&nbsp;new&nbsp;Thread(new&nbsp;Foo()); t.start(); //&nbsp;...&nbsp; int&nbsp;value&nbsp;=&nbsp;t.getValue();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java