您的位置:首页 > 编程语言 > Java开发

java的同步方法异步处理

2015-12-29 12:17 405 查看
有时需要处理一个大任务,这个大任务处理完可能需要80秒,如果按照正常来访问就会出现超时,这时就会想着把这个大任务拆分,比如可以分成两个(根据任务性质来拆分)可以并行处理的子任务,第一个子任务用时30秒,第二个子任务用时30秒,再花20秒来整合结果,这样只用了50秒就完成了,就不会超时了。

下面是这个思路的一个简单实现:

任务一代码:
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;

public class Task001  implements Callable<String>{

private String name;
private CountDownLatch countDown;
public Task001(String name){
this.name=name;
}
public Task001(String name,CountDownLatch countDown){
this(name);
this.countDown=countDown;
}
@Override
public String call() throws Exception {
long begin=System.currentTimeMillis();
System.out.println(name+" 任务一开始....");
Thread.sleep(3000);
System.out.println(name+" 任务一结束....");
System.out.println("任务一 用时:"+((System.currentTimeMillis()-begin)/1000)+"秒");
if(this.countDown!=null)this.countDown.countDown();
return "成功一";
}

}


任务二代码:

import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;

public class Task002  implements Callable<String>{

private String name;
private CountDownLatch countDown;

public Task002(String name){
this.name=name;
}
public Task002(String name,CountDownLatch countDown){
this(name);
this.countDown=countDown;
}
@Override
public String call() throws Exception {
long begin=System.currentTimeMillis();
System.out.println(name+" 第二个分任务开始....");
Thread.sleep(5000);
System.out.println(name+" 第二个分任务结束....");
System.out.println("任务二 用时:"+((System.currentTimeMillis()-begin)/1000)+"秒");
if(this.countDown!=null)this.countDown.countDown();
return "成功二";
}

}
主方法的两种实现

实现一:
public static void main(String[] args) throws InterruptedException, ExecutionException {
long begin=System.currentTimeMillis();
ExecutorService  executorService =Executors.newFixedThreadPool(2);
Future<String> future=executorService.submit(new Task001("张三"));
Future<String> future2=executorService.submit(new Task002("李四"));
executorService.shutdown();
System.out.println("*-------------");
while(!executorService.isTerminated()){
Thread.sleep(100);
}
System.out.println("执行完善结果:"+future.get()+":"+future2.get()+" 总用时:"+((System.currentTimeMillis()-begin)/1000)+"秒");
}


实现二:

public static void main(String[] args) throws InterruptedException, ExecutionException {
CountDownLatch  countDown=new CountDownLatch(2);
long begin=System.currentTimeMillis();
ExecutorService  executorService =Executors.newFixedThreadPool(2);
Future<String> future=executorService.submit(new Task001("张三",countDown));
Future<String> future2=executorService.submit(new Task002("李四",countDown));
executorService.shutdown();
System.out.println("*-------------");
countDown.await();
System.out.println("执行完善结果:"+future.get()+":"+future2.get()+" 总用时:"+((System.currentTimeMillis()-begin)/1000)+"秒");
}
运行结果:

张三 任务一开始....

李四 第二个分任务开始....

*-------------

张三 任务一结束....

任务一 用时:3秒

李四 第二个分任务结束....

任务二 用时:5秒

执行完善结果:成功一:成功二 总用时:5秒

可以从结果看出:第一个任务用了3秒、第二个任务用了5秒。但是总的用时只有5秒而不是8秒。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: