Callable与Future
来源:互联网 发布:js精确到小数点后两位 编辑:程序博客网 时间:2024/06/05 03:53
Callable与Runnable类似,但是有返回值,其接口是一个参数化的类型,只有一个call方法(类似Runnable中的run方法)
Future保存异步计算的结果,可以启动一个计算(callable),将Future对象交付给线程即可。当计算结束时,通过get方法获取计算结果。若计算未完成,则调用被阻塞,直到完成。可以通过isDone方法判断计算是否完成。
FutureTask包装器,可将Callable转换为Future和Runnable,同时实现二者的接口。
Callable_1 callable1=new Callable_1();FutureTask<Integer> result=new FutureTask<>(callable1);new Thread(result).start();result.get();
eg1:通过callable和future打印一组数据
package com.lmr.thread;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.FutureTask;public class Callable_Future_1 { public static void main(String[] args) { Callable_1 callable1=new Callable_1(); FutureTask<Integer> result=new FutureTask<>(callable1); new Thread(result).start();//启动result的FutureTask对象,去执行callable1的call方法 System.out.println("main thread is running"); try { System.out.println("result: "+result.get());//获取结果 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("main thread is ending"); }}public class Callable_1 implements Callable<Integer>{ @Override public Integer call() throws Exception { // TODO Auto-generated method stub System.out.println("callable is runing"); int sum=0; for(int i=0;i<10;i++){ Thread.sleep(1000); sum+=i; System.out.println(i+" - "+sum);//每隔1秒打印数据 } return sum; }}
通过打印的结果,我们发现到程序跑到get方法时,并没有获取到结果,而是等callable1的call方法执行完毕后,才会打印结果
callable is runingmain thread is running0 - 01 - 12 - 33 - 64 - 105 - 156 - 217 - 288 - 369 - 45result: 45main thread is ending
eg2:搜索指定目录下所有文件内容,计算关键字的个数
package com.lmr.thread;import java.io.File;import java.io.FileNotFoundException;import java.util.ArrayList;import java.util.List;import java.util.Scanner;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.Future;import java.util.concurrent.FutureTask;public class Callable_Future_2 { public static void main(String[] args) { String directory="E:\\Java_Swing\\src\\com\\swing"; String keyword="JPanel"; MatchCount counter=new MatchCount(new File(directory), keyword); FutureTask<Integer> task=new FutureTask<>(counter); Thread t=new Thread(task); t.start(); try { System.out.println("------------- "+task.get()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}class MatchCount implements Callable<Integer>{ private File directory; private String keyword; private int count;//关键字数目 public MatchCount(File directory,String keyword) { // TODO Auto-generated constructor stub this.directory=directory; this.keyword=keyword; } @Override public Integer call() throws Exception { // TODO Auto-generated method stub count=0; try{ File[] files=directory.listFiles(); List<Future<Integer>> results=new ArrayList<>();//Future对象List for(File file:files){ if(file.isDirectory()){ MatchCount counter=new MatchCount(file, keyword);//递归遍历 FutureTask<Integer> task=new FutureTask<>(counter); results.add(task); Thread t=new Thread(task); t.start(); } else{ if(search(file)){//若是文件,则去计算数目 count+=searchsum(file); } } } for(Future<Integer> result:results){//当该目录下所有文件的Future计算完后,累加数目 count+=result.get(); } } catch (Exception e) { // TODO: handle exception } return count; } public boolean search(File file){//判断文件是否有关键字 try{ Scanner in=new Scanner(file); boolean found=false; while(!found&&in.hasNextLine()){ String line=in.nextLine(); if(line.contains(keyword)){ found=true; } } return found; } catch (Exception e) { // TODO: handle exception return false; } } public int searchsum(File file) throws FileNotFoundException {//关键字计数 Scanner in = new Scanner(file); int found = 0; while (in.hasNextLine()) { String line = in.nextLine(); while (line.contains(keyword)) { System.out.println(line); line=line.substring(line.indexOf(keyword)+keyword.length()); found++; } } return found; }}
0 0
- Callable 与 Future
- Callable与Future
- Callable与Future
- Callable与future
- Callable与Future
- Callable与future接口
- 浅谈Future与Callable
- Callable与Future
- Callable与Future
- Callable与Future
- Callable与Future
- Callable与Future
- Callable与Future
- Callable与Future
- Callable与Future的应用
- Java接口:Callable 与 Future
- 黑马程序员-Callable与Future
- Callable与Future的介绍
- Edittext和软键盘的关系应用
- java笔记JVM1
- LeetCode513. Find Bottom Left Tree Value题解
- malloc的开辟----重修订
- MCU—直流电机
- Callable与Future
- LeetCode 26. Remove Duplicates from Sorted Array
- Oracle代码大全.从入门到熟练
- 【phi】
- 百度富文本编辑器的上传图片的路径问题
- python替换特定字符串
- HDU 2660 Accepted Necklace (01背包,dfs)
- HDU5289 Assignment
- 字符串