`

多线程 ExecutorService CountDownLatch

    博客分类:
  • Java
 
阅读更多
package com.hbw.model;

public class User {

public User(){}
public User(int id,String name){
this.id=id;
this.name=name;

}
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}


}


package com.hbw.dao;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.hbw.model.User;

public class UserDao {

private static int recordCount=899;
private int pageSize=100;
private int page=1;

private static List<User> list=Collections.synchronizedList(new ArrayList<User>());
static{
for (int i = 001; i <= recordCount; i++) {
User user=new User(i,"姓名:"+i);
list.add(user);
}
}

public  List<User> getUserData(int pageSize, int page){
this.pageSize=pageSize;
this.page=page;
if(pageSize*(page+1)>list.size()){
return list.subList(page*100, list.size());
}else{
return list.subList(page*100, pageSize*(page+1));
}
}
public int getPageCount() {
return (recordCount == 0) ? 1 : ((recordCount % pageSize == 0) ? (recordCount / pageSize)
: (recordCount / pageSize) + 1);
}

public static void main(String[] args) {
UserDao dao=new UserDao();
List<User> list=dao.getUserData(100, 4);
for (User user : list) {
System.out.println(user.getId()+"____"+user.getName());
}
}
}


package com.hbw.thread;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

import com.hbw.dao.UserDao;
import com.hbw.model.User;


public class ExecutorServiceDemo {
// 默认的并发级别
private final static int DEFAULT_CONCURRENCY_LEVEL = 5;
// 是否已经加载到最后一页
private volatile boolean isLastPage;
// 当前页
private AtomicInteger currentPage = new AtomicInteger(1);
// 总数
private static AtomicInteger count = new AtomicInteger(0);

private static ExecutorService executorService = Executors.newFixedThreadPool(DEFAULT_CONCURRENCY_LEVEL);

public static List<User> tempList= Collections.synchronizedList(new ArrayList<User>());

public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(DEFAULT_CONCURRENCY_LEVEL);

long startTime=System.currentTimeMillis();
ExecutorServiceDemo test=new ExecutorServiceDemo();
test.getData(latch);
latch.await();
executorService.shutdown();
long endTime=System.currentTimeMillis(); //获取结束时间
System.err.println(tempList.size());
System.err.println("程序运行时间: "+((endTime-startTime)/1000)+"s:"+count.get());
}

public  int getData(final CountDownLatch latch) throws InterruptedException{


final UserDao dao=new UserDao();
System.out.println(dao.getPageCount());
for(int i = 0; i < DEFAULT_CONCURRENCY_LEVEL; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
while(!isLoadLast()) {
int pageNum = currentPage.getAndIncrement();
if(pageNum > dao.getPageCount()) {
isLastPage = true;
continue ;
}

List<User> list=dao.getUserData(100,pageNum-1);

for (User u : list) {
System.out.println(u.getId()+"_____"+u.getName());
count.incrementAndGet();
tempList.add(u);
}
}
latch.countDown();
}
});
}
return count.get();

}

public boolean isLoadLast() {
return isLastPage;
}

}
分享到:
评论

相关推荐

    利用 CountDownLatch 类实现线程同步

    在实际开发中,结合 `ExecutorService` 和 `Future`,我们可以构建更复杂的并发控制策略,以优化多线程程序的性能和可维护性。然而,也要注意,过度使用或不恰当使用同步工具可能导致死锁或性能下降,因此在设计并发...

    JAVAJAVA多线程教学演示系统论文

    2. **JAVA多线程API**:论文会详细阐述JAVA提供的多线程API,如Thread类、Runnable接口、ExecutorService和Future接口等。通过实例解析这些类和接口的使用方法,帮助读者理解如何在实际编程中创建和管理线程。 3. *...

    多线程终极案例程序(多线程进阶)

    在IT行业中,多线程是Java编程中一个重要的高级特性,尤其对于开发高效能和响应迅速的应用至关重要。这个“多线程终极案例程序”旨在帮助Java开发者深化对多线程的理解,通过一个具体的“多兵种联合攻击防御塔”游戏...

    多线程demo/java多线程练习

    - **CountDownLatch**:常用于多线程间的同步,计数器从正整数开始,每当一个线程完成任务,计数器减一,当计数器为零时,所有等待的线程将被释放。 - **CyclicBarrier**:允许一组线程等待彼此到达某个屏障点,...

    java实现多线程文件传输

    9. **并发工具类**:`CountDownLatch`、`CyclicBarrier`和`Semaphore`等并发工具类可以帮助控制线程的启动和同步,提高多线程操作的协调性。 10. **安全性**:在多线程环境下,文件操作需注意文件锁,避免同一时刻...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...

    线程池管理多线程上传

    线程池管理和多线程上传是并发编程中的一个重要实践,特别是在大数据传输和网络服务中。在Java等编程语言中,线程池通过有效地管理和复用线程资源,避免了频繁创建和销毁线程带来的开销,提升了系统性能。下面将详细...

    多线程,高并发.zip

    在IT领域,多线程和高并发是两个关键概念,特别是在Java编程中,它们对于构建高效、可扩展的系统至关重要。下面将详细解释这两个概念及其在Java中的实现和应用。 多线程是指在一个应用程序中同时运行多个独立的执行...

    java线程并发countdownlatch类使用示例

    在实际应用中,`CountDownLatch`常用于分布式系统、多线程协作、测试场景等,例如等待所有客户端连接完成、确保所有数据加载完毕后再开始服务等。 总结一下`CountDownLatch`的主要知识点: 1. `CountDownLatch`是...

    多线程demo程序-轻松掌握多线程技术

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在服务器端开发和高并发应用中,多线程能够充分利用CPU资源,提高程序的运行效率。这个名为"多线程demo程序-轻松掌握多线程技术"的项目,旨在帮助开发者理解...

    多线程的实验

    "多线程.pdf"很可能包含更详细的理论解释和案例分析,可能涵盖了线程优先级、线程生命周期(新建、就绪、运行、阻塞、死亡)、线程安全的数据结构(如ConcurrentHashMap)以及高级特性如线程局部变量(ThreadLocal)...

    java多线程进度条

    为了在多线程中同步进度更新,我们可以利用synchronized关键字、wait()、notify()方法,或者使用Java并发库中的高级工具,如Semaphore、CyclicBarrier或CountDownLatch等。 一个简单的进度条实现可以采用共享变量...

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

    此外,Java还提供了并发工具类,如`java.util.concurrent`包下的`ExecutorService`、`Semaphore`、`CountDownLatch`等,这些工具可以帮助开发者更高效地管理和协调线程,提高并发性能。 总之,Java的多线程和并发...

    java并发(二十四)多线程结果组装

    在Java中,我们可以通过`ExecutorService`和`Future`来管理多线程任务,并获取它们的执行结果。`ExecutorService`是`java.util.concurrent`包中的一个接口,用于管理和控制线程的生命周期,如启动线程、关闭线程池等...

    多线程

    此外,java.util.concurrent包提供了一系列高级的线程池和并发工具,如ExecutorService,Semaphore,CountDownLatch,CyclicBarrier等,这些工具可以更方便、高效地管理多线程。 在实际开发中,工具的选择也至关...

    java大批量导入excel,多线程加分片处理的dome

    ### Java大批量导入Excel:多线程加分片处理详解 #### 概述 在实际工作中,经常需要批量处理大量的Excel数据。当面对成千上万甚至百万级别的数据时,简单的单线程处理方式往往无法满足效率的需求。为了解决这个...

    JAVA项目——多线程下载代码

    在Java编程领域,多线程下载是一种常见的优化技术,它能显著提高大文件下载的速度,通过将文件分割成多个部分并行下载,充分利用了网络带宽。本项目以"JAVA项目——多线程下载代码"为主题,使用Eclipse集成开发环境...

    精通java多线程

    Java多线程是Java编程语言中的一个重要特性,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多核处理器的普及使得多线程技术成为提升性能的关键手段。本篇将深入探讨Java多线程...

    Java多线程端口快速扫描

    - `CountDownLatch`:计数器,常用于多线程同步,例如,所有线程都完成任务后才能继续执行后续操作。 - `CyclicBarrier`:循环栅栏,允许一组线程等待其他线程到达某个点,然后一起继续执行。 4. **TCP连接与套接...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

Global site tag (gtag.js) - Google Analytics