java线程创建之FutureTask
2017-06-13 11:42
169 查看
想这个题目时自己也觉得有点naive,但是看过我博客的也都知道,我是不可能说讲某一个话题就只讲某一个话题的(我不是在为我的跑题找借口,你信不信)但是前两种线程的创建方法实现Runnable和继承Thread我确实不打算讲了~~~下面就说一下第三种方法,使用FutureTask创建 刚开始学并发时看到这个感觉好复杂,其实也并不是如此,只要理清了这些类的关系,一切都是那么顺其自然和合情合理。就是我们可以通过Thead thread=new Thread(new FutureTask(new MyCallable()));然后对这个Thread进行start()就可以启动了。听到这儿可能有点听不懂?你主要的疑惑可能在这个FutureTask是个啥。讲一下结构,FutureTask是一个实现Future的类,Future是一个包装的任务器,之所以说他是一个包装的任务器,是因为它具有针对 进行的任务的一个管理功能比如取消,取得结果,判断是否结束等功能。往往我们不能直接对其实例化我们经常会使用其实现类FutureTask :Future future=new FutureTask(new MyCallable());以这样的方式来获取Future来管理我们提交的任务。这里我没有说“来管理我们运行的线程”也就是管理通过上面说的第三种线程启动方式的线程,而是上面如是说,是因为我们往往在使用中会更多的以任务提交的方式来运行我们项进行的任务也就是通过我们的线程池来“装配”任务,然后来有效运行。下一篇博文我会讲线程池应用的,这里先卖个关子。 当然,上面可能就会有人有疑问,我看我们的Thread的构造方法时,它的参数必须有Runnable类型参数啊,凭什么FutureTask实现了Future就可作为Thread的参数来创造线程了呢?是的,我们从Future接口提供的方法中丝毫看不出它和线程运行要提供的Runnable有直接关系,但是我们的FutureTask却是一个实现RnnableFuture的类,看到它实现的接口你会不会很有感觉?RunnableFuture难不成实现了Runnable?!显然啊!从他的名字就看出来了!既然如此,显然我们的FutureTask肯定就会实现run()方法了!!所以它就可以作为Thread的参数来创造线程了!从这里也说明了它具有Future管理任务的功能。 好了,FutureTask讲的差不多,但是讲真感觉有点不尽兴,, 这里就大致总结一下我们在实际中运用的方法吧。Future使用你可以向上面我们说的利用他的实现类来实现一个FutureTask从而实现管理任务的功能!当然也可以通过我们下个博文要讲的通过线程池服务Future future=ExcutorService.submit();(其实也是通过获取到FutureTask来管理的,但是方式不同所以就讲一下)然后就可以对任务进行管理。比如我自己写的,某个代码片段(实现并发遍历文件): ForkJoinPool pool=new ForkJoinPool(); File file=new File("E://android"); Future<List<File>> list=pool.submit(new Fork1(file)); //File[] list2=new File[list.get().size()]; try { for(File f:list.get()){ if(f.isDirectory()) 8e84 System.out.println("文件夹:"+f.getName()); else{ System.out.println("文件:"+f.getName()); } } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } 我把自己实现的Fork1的代码也给出来,感兴趣的自己看看吧![这里写图片描述](https://img-blog.csdn.net/20170613114212946?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hpbmFfd29uZGVyZnVs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 好了要去吃饭了,期待下一个博文
相关文章推荐
- Java 异步线程FutureTask的使用和SwingWorker
- Java线程之FutureTask
- Java线程之FutureTask
- Java线程之FutureTask与Future浅析
- Java线程之FutureTask与Future浅析
- java线程之FutureTask
- Java线程之FutureTask与Future浅析
- java 多线程(一)---创建线程的三种方式Thread,Runnable,Callable与Future
- Java并发编程之线程创建和启动(Thread、Runnable、Callable和Future)
- 用C++11的std::async代替线程的创建and std::future、std::promise和std::packaged_task
- java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService
- Java线程之FutureTask
- Thinking in java中创建线程任务Task的基本方法
- 开发笔记:创建Java线程的两种方法
- 内存溢出,无法创建新的本地线程的原因和解决方案 - java.lang.OutOfMemoryError: unable to create new native thread
- Java创建线程
- java中的线程创建和使用
- Java时区bug,TimeZone.setDefault()只在当前线程和之后创建的子线程有效
- 创建Java线程的两种方法
- Java多线程初学者指南(3):使用Runnable接口创建线程