Java中实现多线程关键词整理(总结)
Java中的Runable,Callable,Future,FutureTask,ExecutorService,Excetor,Excutors,ThreadPoolExcetor在这里对这些关键词,以及它们的用法做一个总结。
首先将它们分个类:
Runable,Callable
Future,FutureTask
ExecutorService,Excetor,Excutors,ThreadPoolExcetor
1.关于Ranable和Callable
首先Java中创建线程的方法有三种:
- 继承Thread类,覆盖run方法
- 实现Runable接口,实现run方法
- 实现Callable接口,实现run方法
三种实现的优缺点:
继承Thread,单继承的缘故,不能再继承其他类,获取当前线程this
实现Runable接口,没有返回值,获取当前线程Thread.currentThread()
实现Callable接口,可通过Future.get()获取返回值,获取当前线程Thread.currentThread()
继承Thread,两个步骤:
classDemoThreadextendsThread{ @Override publicvoidrun(){ super.run(); //Performtime-consumingoperation... } } DemoThreadt=newDemoThread(); t.start();
- 继承Thread类,覆盖run()方法。
- 创建线程对象并用start()方法启动线程。
实现Runable,一般使用如下:
newThread(newRunnable(){ @Override publicvoidrun(){ //dosomething } }).start();
为了简单。
以上两种方式获取线程执行的结果相当麻烦,不能直接获取。JDK1.5增加了Callable,Callable的call()方法可以返回值和抛出异常。Callable可以返回装载有计算结果的Future对象。
Callable的源码:
publicinterfaceCallable{ Vcall()throwsException; }
Callable的基本使用方法:
FutureTaskfutureTask=newFutureTask (newCallable (){ @Override publicIntegercall()throwsException{ //dosomething returnnull; } }); Threadthread=newThread(futureTask); thread.start(); Integerresult=futureTask.get();
运行Callable任务可以拿到一个Future对象,通过Future的get()方法拿到线程执行的返回值。那么...Future,
FutureTask区别是什么,怎么使用?
->next()
2.关于Future和FutureTask
为了获取线程的执行结果,引入了Future的FutureTask,那么他们是什么关系,如何使用?
Future类位于java.util.concurrent包下,它是一个接口:
publicinterfaceFuture{ booleancancel(booleanmayInterruptIfRunning); booleanisCancelled(); booleanisDone(); Vget()throwsInterruptedException,ExecutionException; Vget(longtimeout,TimeUnitunit) throwsInterruptedException,ExecutionException,TimeoutException; }
Future定义了5个方法:
1)booleancancel(booleanmayInterruptIfRunning):试图取消对此任务的执行。如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则此尝试将失败。当调用cancel()时,如果调用成功,而此任务尚未启动,则此任务将永不运行。如果任务已经启动,则mayInterruptIfRunning参数确定是否应该以试图停止任务的方式来中断执行此任务的线程。此方法返回后,对isDone()的后续调用将始终返回true。如果此方法返回true,则对isCancelled()的后续调用将始终返回true。
2)booleanisCancelled():如果在任务正常完成前将其取消,则返回true。
3)booleanisDone():如果任务已完成,则返回true。可能由于正常终止、异常或取消而完成,在所有这些情况中,此方法都将返回true。
4)Vget()throwsInterruptedException,ExecutionException:如有必要,等待计算完成,然后获取其结果。
5)Vget(longtimeout,TimeUnitunit)throwsInterruptedException,ExecutionException,TimeoutException:如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。
总的来说Future提供了三种功能:
判断任务是否完成;
能够中断任务;
能够获取任务执行结果。
重点:
RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口。
FutureTask的实现:
publicclassFutureTaskimplementsRunnableFuture
RunnableFuture接口的实现:
publicinterfaceRunnableFutureextendsRunnable,Future { voidrun(); }
FutureTask是Future接口的一个唯一实现类。
除了可以用Thread包装FutureTask外,还有另一种使用方法:
ExecutorServiceexecutor=Executors.newCachedThreadPool(); FutureTaskfutureTask=newFutureTask (newCallable (){ @Override publicIntegercall()throwsException{ //dosomething returnnull; } }); executor.submit(futureTask); Integerresult=futureTask.get();
这里用到了Executor框架。
->next();
3.关于ExecutorService,Excetor,Excutors,ThreadPoolExcetor
Executor框架在Java5中被引入,Executor框架是一个根据一组执行策略调用、调度、执行和控制的异步任务的框架。
在说Executor框架之前我们需要引入一个新的概念——线程池(ThreadPoolExecutor):
publicThreadPoolExecutor(intcorePoolSize, intmaximumPoolSize, longkeepAliveTime, TimeUnitunit, BlockingQueueworkQueue, ThreadFactorythreadFactory, RejectedExecutionHandlerhandler)
ThreadPoolExecutor是Executors类的底层实现。
在JDK帮助文档中,有如此一段话:
“强烈建议程序员使用较为方便的Executors工厂方法Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)、Executors.newFixedThreadPool(int)(固定大小线程池)和Executors.newSingleThreadExecutor()(单个后台线程),它们均为大多数使用场景预定义了设置。”
那么ExecutorService,Excetor,Excutors都是什么?
Excetor是一个抽象层面的核心接口:
publicinterfaceExecutor{ voidexecute(Runnablecommand); }
ExecutorService接口对Executor接口进行了扩展,提供了返回Future对象,终止,关闭线程池等方法。
publicinterfaceExecutorServiceextendsExecutor{ voidshutdown();Future submit(Callable task); Future submit(Runnabletask,Tresult); List >invokeAll(Collection>tasks,longtimeout,TimeUnitunit)throwsInterruptedException; }
Executors是一个工具类,类似于Collections。提供工厂方法来创建不同类型的线程池,比如FixedThreadPool或CachedThreadPool。
publicclassExecutors{ publicstaticExecutorServicenewFixedThreadPool(intnThreads){ returnnewThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue()); } publicstaticExecutorServicenewCachedThreadPool(){ returnnewThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,newSynchronousQueue ()); } }
以上是对Java多线程关键词的整理,不至于一团乱麻。
以上所述是小编给大家介绍的Java中实现多线程关键词整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!