首页天道酬勤options,futures and other,future task

options,futures and other,future task

张世龙 05-05 20:41 39次浏览

Runnable、Callable、Future、FutureTask的区别:

参考:https://Bai jiahao.Baidu.com/s? id=1631326488605078999 wfr=spider for=PC

一般来说,创建线程的方法:继承Thread,实现Runnable

因为两者都没有返回值,所以必须在Handler中发送和处理结果

这两种传统方法都推荐使用Runnable。 因为Thread只能继承,Java只有单个继承,Runnable通过接口。

在线程池中,可以直接传递Runnable进行使用; 例如

privateexecutorserviceexecutorservice=executors.newfixedthreadpool (5; executorservice.execute (new runnable ) ({ @Override public void run ) )//. } ); java1.5之后是Callable和Future。 这两个提供线程返回的结果。

1.Runnable:

thread thread=new thread (new runnable () { @Override public void run ) /……} ); thread.start (;

带:thread的start和run有什么区别?

start通过打开新线程,线程处于就绪状态,在获得cpu时间片后开始运行;

run:是类的常用方法,直接调用run时,程序中仍然只有主线程

2.Callable

与Runnable的区别在于它有返回的结果,可以抛出异常。 通常与线程池联合调用

callable callable=newcallablestring { @ overridepublicstringcall } throws exception { return ' result '; }; executorserviceexecutorservice=executors.newfixedthreadpool (5; future future=executorservice.submit (callable; try { system.out.println (future.get ) }; } catch (执行任务) { e.printStackTrace ); } catch (互联互通) { e.printStackTrace ); }

3.Future

Future还是一个界面,允许您取消特定的Runnable或Callable任务并获取执行结果

如果为Runnable,则获取的结果为null,get阻止当前调用get的线程,并且在返回结果或超时之前不会启动当前线程。

publicinterfacefuturev { boolean cancel (booleanmayinterruptifrunning; //取消任务的布尔型is cancelled (); 判断boolean isDone (是否已取消; //任务为vget (throwsinterruptedexception,执行执行执行); //任务执行结果vget (长时间输出,时间单元单元)//超时时间throws InterruptedException,ExecutionException,时间输出exception; }

4.Future任务

与Future相比的好处是,Future是接口,不能直接新建

FutureTask是实现RunnableFuture接口的类;

RunnableFuture还实现了Runnable和Future两个接口;

因此,FutureTask作为Runnable运行在线程上,具有Future的特性(结果的获取/异常的抛出)

publicfuturetask (callablevcallable ) if ) callable==null (throw new nullpointerexception ); this.callable=callable; this.state=NEW; //ensurevisibilityofcallable } publicfuturetask (runnable runnable,V result ) this.callable=executors.calllable ) ) ruruble //ensure visibility of callable }

使用

futuretaskfuturetask=newfuturetask (callable; futureTask附带返回结果,因此可以不使用submit方法executorservice.execute (future task )的try { system.out.println (future tastase task ) } catch (执行任务) { e.printStackTrace ); } catch (互联互通) { e.printStackTrace ); }

5.submit方法

疑问:为什么要使用submit方法而不是execute方法?

答案:如果需要返回结果,则返回submit;

submit方法的实现

//传递的是Runnable,将Runnable转换为FutureTask实例public Future? submit (运行任务) if ) task==null (throw new nullpointerexception ); runnablefuturevoidftask=新任务for (task,null ); 执行(ft ask ); 返回ft ask; //传递的是Callable,将Runnable作为FutureTask实例publictfuturetsubmit (callablettask ) if ) task==null ) thrownewnulpointerer 执行(ft ask ); 返回ft ask; }//FutureTask是RunnableFuture接口的实现类protectedtrunnablefuturetnewtaskfor (runnable runnable,T value ) returnewfuturure

submit是将传递的Runnable或Callable转换为RunnableFuture并调用execute

因此,如果从一开始就是FutureTask,则可以直接使用execute

runloop和线程有什么关系,runnable和callable区别