java多线程callable例子,java中runnable和callable的区别

  java多线程callable例子,java中runnable和callable的区别

  使用Runnable和Callable接口实现多线程的区别

  首先看两个实现的步骤:

  1.实现可运行接口

  公共类thread demo { public static void main(String[]args){ for(int I=1;I=5;I) {//创建并启动线程newthread (newrunner(), thread i)。通过实现Runnable接口创建的start();} } }//实现runnable接口ClassRunner实现Runnable {//实现Run方法@ Override Public Void Run(){ system . out . println(thread . current thread()。GetName()创建了一个可运行的接口);}}2.实现可调用接口

  公共类thread demo { public static void main(String[]args)抛出ExecutionException,interrupted exception { for(int I=1;I=5;I) {//保存线程结果FutureTask用future task future task string future task=NewFutureTaskString(new caller());//创建并启动线程newthread (futuretask, thread i)。start()是通过实现Callable创建的;//获取线程执行结果system . out . println(future task . Get());} } }//实现可调用接口classCaller实现Callable {//实现调用接口@ override公共对象call()throws exception { string result=thread . current thread()。“通过实现可调用接口创建的getname()”;返回结果;}}从上面的代码中可以看出,使用Callable接口创建多线程时使用FutureTask进行封装,然后将FutureTask作为参数传递给Thread的构造函数,FutureTask用于存储Callable接口调用方法的返回值。我们来看看FutureTask的源代码。

  //FutureTask实现了RunnableFuture接口公共类futuretaskv实现了RunnableFuturev { }//再看runnable future接口,继承了runnable接口公共接口Runnablefuturev扩展了runnable,futurev { void run();}//回到FutureTask,找到运行方法public void run () {.可调用v c=可调用;如果(c!=null state==NEW){ V result;布尔冉;Try {//获取调用结果=c.call()的返回值;ran=true} catch(Throwable ex){ result=null;ran=falseset exception(ex);} if(ran)set(result);} .}//看一下set方法Protected Voidset (v v) {if (unsafe。compareandswapint (this,state offset,new,completing)){ outcome=v;} }//看看FutureTask的构造函数,public future task(callable v callable){ if(callable==null)抛出new nullpointerexception();this.callable=callablethis.state=NEW}从FutureTask的源代码分析可以看出,FutureTask实现了runnable接口的run方法,在Run方法中调用可调用的Call方法,将结果保存为result,通过set方法将结果保存为outcome变量。

  通过上面的分析,我们总结了使用Runnable和Callable接口的区别:

  1.用Runnable接口更容易实现,而通过Callable接口创建线程需要FutureTask来封装;

  2.实现Runnable接口创建的线程没有返回值,而使用Callable接口创建的线程可以有一个返回结果并保存在FutureTask中;

  3.实现Runnable接口创建的线程不会抛出异常,但是使用Callable接口创建的线程会抛出异常;

  从上面的总结中我们也可以看出,Runnable适用于不需要返回值的场景,而Callable接口则用于需要保存返回值的场景。

  关于Java使用Runnable和Callable实现多线程的区别这篇文章就到这里了。有关Java Runnable Callable多线程的更多信息,请搜索以前关于流行IT的文章或继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: