猿问

从Thread返回值

从Thread返回值

我有一个方法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();}


暮色呼如
浏览 1133回答 3
3回答

隔江千里

您可以使用本地最终变量数组。变量必须是非基本类型,因此您可以使用数组。您还需要同步两个线程,例如使用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;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;Or&nbsp;could&nbsp;uiThread.join(); &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;or&nbsp;raises&nbsp;an&nbsp;exception&nbsp;if&nbsp;the&nbsp;thread&nbsp;dies,&nbsp;so&nbsp;safer &nbsp;&nbsp;&nbsp;&nbsp;executor.shutdown();}

子衿沉夜

通常你会这样做&nbsp;public&nbsp;class&nbsp;Foo&nbsp;implements&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;}然后你可以创建线程并检索值(假设已经设置了值)Foo&nbsp;foo&nbsp;=&nbsp;new&nbsp;Foo();Thread&nbsp;thread&nbsp;=&nbsp;new&nbsp;Thread(foo);thread.start();thread.join();int&nbsp;value&nbsp;=&nbsp;foo.getValue();tl;dr线程无法返回值(至少没有回调机制)。您应该像普通类一样引用一个线程并询问该值。

白猪掌柜的

您正在寻找的可能是Callable<V>接口代替Runnable,并使用Future<V>对象检索值,这也让您等到计算出值。你可以通过一个ExecutorService你可以得到的来实现这一目标Executors.newSingleThreadExecutor()。public&nbsp;void&nbsp;test()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x; &nbsp;&nbsp;&nbsp;&nbsp;ExecutorService&nbsp;es&nbsp;=&nbsp;Executors.newSingleThreadExecutor(); &nbsp;&nbsp;&nbsp;&nbsp;Future<Integer>&nbsp;result&nbsp;=&nbsp;es.submit(new&nbsp;Callable<Integer>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Integer&nbsp;call()&nbsp;throws&nbsp;Exception&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;the&nbsp;other&nbsp;thread &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;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;result.get(); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;failed &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;es.shutdown();}
随时随地看视频慕课网APP

相关分类

Java
Android
我要回答