//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;
}
}
相关推荐
我们使用Callable与Future来实现异步编程,将原本需要21次数据库访问的接口改造成10个线程并发访问数据库,极大地缩短了响应时间。 结论 Callable与Future是Java并发编程中两个非常重要的概念,它们通常结合使用来...
线程并发的使用可以显著提升程序处理能力,例如在服务器端处理大量用户请求时,如果每个请求都由单独的线程处理,那么处理速度将大大提高。但同时,多线程并发也会引入一些问题,如数据竞争和同步问题。 为了解决...
Java多线程并发编程是Java开发中的重要领域,特别是在服务器端和高并发应用中不可或缺。`java.util.concurrent`包提供了丰富的工具类,帮助开发者更好地管理线程和优化并发性能。以下将详细介绍标题和描述中涉及的...
│ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机栈实验.mp4 │ 高并发编程第一阶段10讲、Thread构造函数StackSize详细讲解.mp4 │ 高并发编程第一阶段11讲、Thread构造函数StackSize详细讲解-续....
Java中的Runnable、Callable、Future和FutureTask是Java多线程编程中的核心概念,它们各自扮演着不同的角色,共同协作以实现并发任务的管理和执行。 1. **Runnable**: Runnable是最基本的多线程接口,它只有一个`...
8. **Future与Callable接口**:这些接口允许我们异步计算结果,并能够获取任务的执行状态。 9. ** Fork/Join框架**:这是一种并行计算模型,适用于那些可以拆分为子任务并进行并行处理的问题。 10. **并发模式**:...
此外,Java 5引入了`java.util.concurrent`包,包含如`ExecutorService`, `Future`, `Callable`, `Semaphore`, `CyclicBarrier`, `CountDownLatch`等高级并发工具类,这些工具极大地简化了多线程编程。 在并发编程...
如线程、守护线程、线程池、同步机制(synchronized、wait/notify)、并发集合(ConcurrentHashMap、CopyOnWriteArrayList等)以及并发框架(ExecutorService、Future、Callable等)。这些工具和API使得Java程序员...
- **Future和Callable**:Future接口表示异步计算的结果,Callable接口用于定义计算任务。 5. **并发集合**: - **线程安全的集合**:如Vector、ConcurrentHashMap和CopyOnWriteArrayList等,它们在内部实现了...
最后,作者还讨论了并发编程的最佳实践,包括线程池的使用、Future和Callable接口,以及如何通过并发工具类来简化异步编程。这些内容有助于开发者编写出更加优雅、可维护的并发代码。 附带的源码文件可能是书中示例...
高并发编程知识点总结 ...本节总结了高并发编程的相关知识点,包括线程和线程池、线程的实现方式、Java中的Callable和Future、线程安全问题、线程池的重要性和深度解析线程池中的重要接口和抽象类等。
总的来说,这份“java并发编程内部分享PPT”涵盖了Java并发编程的多个重要方面,包括线程创建与管理、同步机制、并发容器、线程池、并发问题以及异步计算。通过深入学习和实践这些知识点,开发者可以更好地应对多...
│ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机栈实验.mp4 │ 高并发编程第一阶段10讲、Thread构造函数StackSize详细讲解.mp4 │ 高并发编程第一阶段11讲、Thread构造函数StackSize详细讲解-续....
Callable 和 Future 是 Java 多线程编程中两个重要的接口,它们在处理异步计算和结果获取方面发挥着关键作用。Callable 与 Runnable 相似,但具有更强大的功能,允许任务返回结果并处理异常。 Callable 接口: ...
Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....
书中通过实例解释了诸如`ExecutorService`、`Future`、`Callable`、`BlockingQueue`等高级并发工具类的使用方法,并详细阐述了如何利用这些工具来构建可伸缩、高性能的应用系统。 #### 二、并发基础知识 本书不仅...
Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....
Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....
Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....
Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....