应需要要在服务器上生成十几万的pdf文件,所有首先想到的是java多线程,先上代码请仔细阅读,最后在总结不足之处希望大家修正
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestThreadPool {
private static int produceTaskSleepTime = 3000;
private static int produceTaskMaxNumber = 10;
public static void main(String[] args) {
// 构造一个线程池
//corePoolSize: 线程池维护线程的最少数量
//maximumPoolSize:线程池维护线程的最大数量
//keepAliveTime: 线程池维护线程所允许的空闲时间
//unit: 线程池维护线程所允许的空闲时间的单位
//workQueue: 线程池所使用的缓冲队列
//handler: 线程池对拒绝任务的处理策略
// 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
// l 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
// l 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
// l 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
//l 当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数
// ThreadPoolExecutor.AbortPolicy()
// 抛出java.util.concurrent.RejectedExecutionException异常
//
// ThreadPoolExecutor.CallerRunsPolicy()
// 重试添加当前的任务,他会自动重复调用execute()方法
//
// ThreadPoolExecutor.DiscardOldestPolicy()
// 抛弃旧的任务
//
// ThreadPoolExecutor.DiscardPolicy()
// 抛弃当前的任务
//总共50个线程,因为核心线程数为10,10个线程被立即运行,线程队列大小为10,
//所以10个线程被加入队列,最大线程数为5000,还能运行50-10=40个,其50个线程的其余10个线程又立即运行了
//一个线程池相当于一个cpu
//两个cpu同时跑缓存队列为10
//ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(1); //固定为4的线程队列
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
//个人认为这个的地方的参数是根据cpu的个数来定的
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2,4,1,
TimeUnit.SECONDS, queue,
new ThreadPoolExecutor.DiscardOldestPolicy());
//多线程
try {
//生成100pdf
int tasks=100;
long t1=System.currentTimeMillis();
System.out.println("开始时间:"+t1);
System.out.println("正在生产数据...");
for(int i=0;i<tasks;i++){
threadPool.execute(new ThreadPoolTask(i));
}
int threadSize = queue.size();
System.out.println("线程队列大小为-->"+threadSize);
//Thread.sleep(produceTaskSleepTime); //休眠是为了让该线程不至于执行完毕后从线程池里释放
threadPool.shutdown();
long t2=System.currentTimeMillis();
System.out.println("运行时间:"+(t2-t1)+"ms");
System.out.println("退出生产者线程!");
} catch (Exception e) {
e.printStackTrace();
}
//单线程
// try {
// int tasks=50;
// threadPool.execute(new ThreadPoolTask(50));
// Thread.sleep(produceTaskSleepTime); //休眠是为了让该线程不至于执行完毕后从线程池里释放
// threadPool.shutdown();
// } catch (Exception e) {
// e.printStackTrace();
// }
}
}
构建程序类ThreadPoolTask
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.Random;
import com.fr.util.Convert;
public class ThreadPoolTask implements Runnable, Serializable {
private Object attachData;
ThreadPoolTask(Object tasks) {
this.attachData = tasks;
}
public void run() {
synchronized (this) {
int taskscount = Convert.ToInt32(this.getTask());
System.out.println(Thread.currentThread().getName());
String newFile = indexof.getBaseApplicationPath()+"gb\\"+"yjqj\\";//构建的新目录
File file = new File(newFile);
if(!file.exists()){
boolean flage =file.mkdirs();
}
String data = null;
try {
data = "data" + this.getTask();
String pdfFile = newFile+data+".pdf";
File f = new File(pdfFile);
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
Thread.currentThread().interrupt();
} finally {
}
}
}
public Object getTask() {
return this.attachData;
}
}
运行结果
开始时间:1367992613865
正在生产数据...
线程队列大小为-->98
运行时间:33ms
退出生产者线程!
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-1
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-2
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
pool-1-thread-2
问题总结
1、在调试模块运行生成pdf个数是正确的,但是在发布到tomcat上面pdf个数就减少了
2、在设置的多线程参数的时候应该根据服务器的内存、cpu的大小来设置
分享到:
相关推荐
标题和描述均指向了一个关于Java多线程设计模式的PDF文档的下载链接,这暗示了文档的主要内容将围绕Java中的多线程编程及其设计模式展开。在Java领域,多线程是一个核心概念,它允许程序执行多个任务同时进行,极大...
### Java多线程文章系列知识点概述 #### 一、Java多线程编程详解 ##### 1. 理解多线程 - **定义**: 多线程是一种机制,允许程序中并行执行多个指令流,每个指令流称为一个线程。 - **特点**: - 线程拥有独立的...
Java多线程是Java应用程序的重要特性,理解和掌握多线程对于Java程序员至关重要。多线程允许在一个程序中同时运行多个不同的线程,每个线程执行各自的任务,它们共享同一内存空间和系统资源,因此可能会相互影响。...
Java游戏高级编程则可能包括更深入的面向对象设计模式、多线程处理、实时渲染技术、物理引擎集成、人工智能算法实现等。 在传统的游戏开发中,Java可能不如C++或C#这类语言那么流行,原因是Java早期的图形和性能...
例如,如果你需要批量生成大量图表,可能需要使用多线程来提高效率。同时,确保PhantomJS的版本与`echarts-java`兼容,因为不同版本之间可能存在差异。 总的来说,`java后台生成echarts图表` 是一种有效的数据可视...
本项目以Java作为编程语言,实现了这样一个多线程Web服务器,这为我们提供了深入理解网络通信、Java多线程以及HTTP协议的机会。 首先,我们要明白Java在Web开发中的角色。Java以其跨平台的特性,广泛应用于服务器端...
例如,使用流式处理减少内存占用,或者使用多线程处理多个请求。 综上所述,实现“Java读取PDF显示在浏览器”涉及到PDF处理库的选择,浏览器的兼容性,服务器与浏览器之间的数据传输,以及安全性与用户体验的考虑等...
比如,缓存预览图片以减少重复生成,使用多线程处理大文件,以及使用适当的文件存储策略以减少I/O开销。 总之,实现上述功能需要对Java Web开发、文件处理、PDF格式以及安全性有深入理解。结合XPDF和其他相关的Java...
为了提升效率,可以考虑优化渲染引擎的配置、减少不必要的计算、或者采用多线程并行处理多个请求。 5. **错误处理**:在服务端处理过程中,可能会遇到各种问题,比如数据格式错误、渲染失败等,因此需要完善错误...
7. **性能优化**:如果需要批量转换大量文件,可以考虑使用多线程技术,或者利用OpenOffice支持的批处理模式,以提高转换效率。 8. **兼容性问题**:虽然OpenOffice对大多数Excel文件格式有良好的支持,但可能会...
6. **多线程编程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口、synchronized关键字、volatile属性以及线程池。这部分内容对于开发高性能、高并发的应用至关重要。 7. **输入/输出流**:Java的I/O流...
这些是商业级的Java应用服务器,它们提供了更多的企业级特性,如负载均衡、集群、事务管理等。 除了JDK和服务器软件,文档中还提及了与Java相关的其他资源,例如O'Reilly出版社提供的Java学习书籍,如《Thinking in...
根据性能需求,可能还需要进行优化,比如缓存模板或使用多线程处理批量请求。 总的来说,这个项目结合了Spring Boot的便利性、Apache POI对Word的处理能力和iText对PDF的处理能力,实现了根据模板动态生成定制化...
本系统采用了MY SQL网络数据库对数据进行统一管理,MY SQL是一个真正的多用户、多线程SQL数据库服务器,极大的满足多位教师并发访问数据库的需要。 系统的设计思想主要基于JAVA、JSP、JavaBeans、XML、MYSQL等新...
- 多线程:Java语言内置对多线程编程的支持,允许程序同时执行多个任务。 3. Java版本: - Java 1.1版本是早期的版本,为Java语言提供了一些基本的特性。 - Java 1.2版本引入了一些新的特性和包,例如Swing图形用户...
7. **多线程**:讲解并发编程基础,如线程的创建、同步、线程池和并发工具类。 8. **枚举与注解**:介绍Java 5引入的新特性,如枚举类型和元注解。 卷II《Advanced Features》则聚焦于Java的高级特性: 1. **图形...
6. **多线程**:Java内置对多线程的支持,使得开发者可以创建并管理多个执行线程,提高程序的并发性能。 7. **网络编程**:Java提供了丰富的API用于网络编程,如Socket和ServerSocket,可用于创建客户端和服务器...
这尤其适合在多线程的Java环境下运行,如Servlets的Web环境,并且可以通过导入“svfrclient.jar”轻松实现接口调用。 当使用Svf_Connect_JavaAPI创建PDF时,生成的PDF文件将被返回至调用的原点——应用服务器,因此...
浅析Java语言中线程的生命周期及实现方式 Java语言中的线程(Thread)是指在同一个进程中可以并发执行的多个控制流程。线程是Java语言中定义的非常重要...了解线程的生命周期和实现方式是Java语言中多线程开发的基础。