java的同步方法异步处理
2015-12-29 12:17
405 查看
有时需要处理一个大任务,这个大任务处理完可能需要80秒,如果按照正常来访问就会出现超时,这时就会想着把这个大任务拆分,比如可以分成两个(根据任务性质来拆分)可以并行处理的子任务,第一个子任务用时30秒,第二个子任务用时30秒,再花20秒来整合结果,这样只用了50秒就完成了,就不会超时了。
下面是这个思路的一个简单实现:
任务一代码:
任务二代码:
实现一:
实现二:
张三 任务一开始....
李四 第二个分任务开始....
*-------------
张三 任务一结束....
任务一 用时:3秒
李四 第二个分任务结束....
任务二 用时:5秒
执行完善结果:成功一:成功二 总用时:5秒
可以从结果看出:第一个任务用了3秒、第二个任务用了5秒。但是总的用时只有5秒而不是8秒。
下面是这个思路的一个简单实现:
任务一代码:
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秒。
相关文章推荐
- Spring 缓存及 第三方缓存接入
- java调用so库
- Huffman编码 java版
- JAVA 几种多线程的简单实例 Thread Runnable
- 更新系统或者更换Eclipse后,双击Eclipse-drawable,或者在布局文件中,查看图片时,显示乱码。png 和 jpg
- java 打jar包和运行jar
- JAVA Socket实现多客户端聊天
- BM算法 java代码
- 用来比较的java接口,Comparator 和 Comparable
- java+ajax实例
- 详细的java(GC)原理
- Java继承中属性、方法和对象的关系
- Spring MVC静态资源处理
- Java基础类Class使用指南
- org.eclipse.swt.SWTError: No more handles的解决办法
- 【spring-security】InMemoryDaoImpl在spring-security4.x版本不存在
- Winform客户端到Java服务端的图片展示和上传
- myeclipse中修改文件打开方式
- C#和java的图片上传和展示
- 简单SpringMVC的学习框架