`

线程并发编程Callable与Future

    博客分类:
  • java
阅读更多

//1-使用5个线程并发-Runnable
 private void send(List<Integer> list){
  List<DataPO> files = dataService.findByIds(list);
  files = Collections.synchronizedList(files);
  for(int i=0;i<5;i++){
   new Thread(new SendDataThread(files)).start();
  }
 }
 
 //2-使用2个线程并发-Callable+FutureTask: 使用Callable+FutureTask获取执行结果
 private void send2(List<Integer> list){
  List<DataPO> files = dataService.findByIds(list);
  //files = Collections.synchronizedList(files);
  //分隔数据
  int len = files.size();
  List<DataPO> files1 = files.subList(0, len/2);
  List<DataPO> files2 = files.subList(len/2, len);
  Map<String, List<DataPO>> map = new HashMap<String, List<DataPO>>();
  map.put("file0", files1);
  map.put("file1", files2);
  Callable[] calls = new Callable[2];
  FutureTask[] tasks = new FutureTask[2];
  try {
   for(int i=0;i<2;i++){
    calls[i] = new SendDataThread2(map.get("file" + i));
    tasks[i] = new FutureTask(calls[i]);
   }
   
   for(int i=0;i<2;i++){
    new Thread(tasks[i]).start();
   }
   System.out.println("**");
   
   List<Integer> result = null;
   for(int i=0;i<2;i++){
    result = (List<Integer>)tasks[i].get();
    System.out.println("*** result " + result.size());
   }
   System.out.println("*****");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 
 //3-使用2个线程并发-Callable+Future: Callable+Future获取执行结果
 private void send3(List<Integer> list){
  List<DataPO> files = dataService.findByIds(list);
  int len = files.size();
  List<DataPO> files1 = files.subList(0, len/2);
  List<DataPO> files2 = files.subList(len/2, len);
  Map<String, List<DataPO>> map = new HashMap<String, List<DataPO>>();
  map.put("file0", files1);
  map.put("file1", files2);
//  files = Collections.synchronizedList(files);
  Callable[] calls = new Callable[2];
  for(int i=0;i<2;i++){
   calls[i] = new SendDataThread3(map.get("file" + i));
  }
  // 创建一个执行任务的服务
  ExecutorService es = Executors.newFixedThreadPool(2);
  try { // 提交并执行任务,任务启动时返回了一个Future对象,
   // 如果想得到任务执行的结果或者是异常可对这个Future对象进行操作
   Future future1 = es.submit(calls[0]);
   System.out.println("*");
   // 获得第一个任务的结果,如果调用get方法,当前线程会等待任务执行完毕后才往下执行
   //System.out.println("task1: " + future1.get());
   Future future2 = es.submit(calls[1]);
   System.out.println("**");
   // 等待5秒后,再停止第二个任务。因为第二个任务进行的是无限循环
   //Thread.sleep(5000);
   System.out.println("task1: " + future1.get());
   System.out.println("***");
   System.out.println("task2: " + future2.get());
   //System.out.println("task2 cancel: " + future2.cancel(true));
  } catch (Exception e) { System.out.println(e.toString()); }
  // 停止任务执行服务
  System.out.println("*****");
  files.clear();
  es.shutdownNow();
 }

 

public class SendDataThread3 implements Callable<List<Integer>> {
 private List<DataPO> files;
 
 public SendDataThread3(List<DataPO> files){
  this.files = files;
 }

 public List<Integer> call() throws Exception {
  List<Integer> result = new ArrayList<Integer>();
  DataPO file = null;
  int len = files.size();
  int no = 0;
  while(no<len){
   file = files.get(no++);
//   files.remove(0);
   result.add(file.getId());
   Thread.currentThread().sleep(1000);
   System.out.println(Thread.currentThread().getName() + "    " + file.getSyscod() + ", " + file.getFilename());
  }
  return result;
 }

}

 

分享到:
评论

相关推荐

    Java并发编程Callable与Future的应用实例代码

    我们使用Callable与Future来实现异步编程,将原本需要21次数据库访问的接口改造成10个线程并发访问数据库,极大地缩短了响应时间。 结论 Callable与Future是Java并发编程中两个非常重要的概念,它们通常结合使用来...

    JAVA多线程并发编程

    线程并发的使用可以显著提升程序处理能力,例如在服务器端处理大量用户请求时,如果每个请求都由单独的线程处理,那么处理速度将大大提高。但同时,多线程并发也会引入一些问题,如数据竞争和同步问题。 为了解决...

    java多线程并发编程例子

    Java多线程并发编程是Java开发中的重要领域,特别是在服务器端和高并发应用中不可或缺。`java.util.concurrent`包提供了丰富的工具类,帮助开发者更好地管理线程和优化并发性能。以下将详细介绍标题和描述中涉及的...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机栈实验.mp4 │ 高并发编程第一阶段10讲、Thread构造函数StackSize详细讲解.mp4 │ 高并发编程第一阶段11讲、Thread构造函数StackSize详细讲解-续....

    Java中的Runnable,Callable,Future,FutureTask的比较

    Java中的Runnable、Callable、Future和FutureTask是Java多线程编程中的核心概念,它们各自扮演着不同的角色,共同协作以实现并发任务的管理和执行。 1. **Runnable**: Runnable是最基本的多线程接口,它只有一个`...

    java并发编程实战源码,java并发编程实战pdf,Java

    8. **Future与Callable接口**:这些接口允许我们异步计算结果,并能够获取任务的执行状态。 9. ** Fork/Join框架**:这是一种并行计算模型,适用于那些可以拆分为子任务并进行并行处理的问题。 10. **并发模式**:...

    Java 多线程与并发编程总结.doc

    此外,Java 5引入了`java.util.concurrent`包,包含如`ExecutorService`, `Future`, `Callable`, `Semaphore`, `CyclicBarrier`, `CountDownLatch`等高级并发工具类,这些工具极大地简化了多线程编程。 在并发编程...

    java 并发编程的艺术pdf清晰完整版 源码

    如线程、守护线程、线程池、同步机制(synchronized、wait/notify)、并发集合(ConcurrentHashMap、CopyOnWriteArrayList等)以及并发框架(ExecutorService、Future、Callable等)。这些工具和API使得Java程序员...

    JAVA并发编程艺术pdf版

    - **Future和Callable**:Future接口表示异步计算的结果,Callable接口用于定义计算任务。 5. **并发集合**: - **线程安全的集合**:如Vector、ConcurrentHashMap和CopyOnWriteArrayList等,它们在内部实现了...

    JAVA并发编程实践.pdf+高清版+目录 书籍源码

    最后,作者还讨论了并发编程的最佳实践,包括线程池的使用、Future和Callable接口,以及如何通过并发工具类来简化异步编程。这些内容有助于开发者编写出更加优雅、可维护的并发代码。 附带的源码文件可能是书中示例...

    高并发编程,高并发编程,高并发编程

    高并发编程知识点总结 ...本节总结了高并发编程的相关知识点,包括线程和线程池、线程的实现方式、Java中的Callable和Future、线程安全问题、线程池的重要性和深度解析线程池中的重要接口和抽象类等。

    java并发编程内部分享PPT

    总的来说,这份“java并发编程内部分享PPT”涵盖了Java并发编程的多个重要方面,包括线程创建与管理、同步机制、并发容器、线程池、并发问题以及异步计算。通过深入学习和实践这些知识点,开发者可以更好地应对多...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机栈实验.mp4 │ 高并发编程第一阶段10讲、Thread构造函数StackSize详细讲解.mp4 │ 高并发编程第一阶段11讲、Thread构造函数StackSize详细讲解-续....

    Callable和Future.doc

    Callable 和 Future 是 Java 多线程编程中两个重要的接口,它们在处理异步计算和结果获取方面发挥着关键作用。Callable 与 Runnable 相似,但具有更强大的功能,允许任务返回结果并处理异常。 Callable 接口: ...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    java并发编程实战(英文版)

    书中通过实例解释了诸如`ExecutorService`、`Future`、`Callable`、`BlockingQueue`等高级并发工具类的使用方法,并详细阐述了如何利用这些工具来构建可伸缩、高性能的应用系统。 #### 二、并发基础知识 本书不仅...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载4.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载2.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载3.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载1.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

Global site tag (gtag.js) - Google Analytics