`
yefengyueyuan
  • 浏览: 7100 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java多线程 生成服务器pdf

    博客分类:
  • java
阅读更多
应需要要在服务器上生成十几万的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的大小来设置
0
6
分享到:
评论

相关推荐

    JAVA多线程设计模式.pdf 下载

    标题和描述均指向了一个关于Java多线程设计模式的PDF文档的下载链接,这暗示了文档的主要内容将围绕Java中的多线程编程及其设计模式展开。在Java领域,多线程是一个核心概念,它允许程序执行多个任务同时进行,极大...

    Java多线程文章系列.pdf

    ### Java多线程文章系列知识点概述 #### 一、Java多线程编程详解 ##### 1. 理解多线程 - **定义**: 多线程是一种机制,允许程序中并行执行多个指令流,每个指令流称为一个线程。 - **特点**: - 线程拥有独立的...

    java多线程讲解.pdf

    Java多线程是Java应用程序的重要特性,理解和掌握多线程对于Java程序员至关重要。多线程允许在一个程序中同时运行多个不同的线程,每个线程执行各自的任务,它们共享同一内存空间和系统资源,因此可能会相互影响。...

    Java游戏高级编程.pdf

    Java游戏高级编程则可能包括更深入的面向对象设计模式、多线程处理、实时渲染技术、物理引擎集成、人工智能算法实现等。 在传统的游戏开发中,Java可能不如C++或C#这类语言那么流行,原因是Java早期的图形和性能...

    java后台生成echarts图表

    例如,如果你需要批量生成大量图表,可能需要使用多线程来提高效率。同时,确保PhantomJS的版本与`echarts-java`兼容,因为不同版本之间可能存在差异。 总的来说,`java后台生成echarts图表` 是一种有效的数据可视...

    用Java实现Web服务器

    本项目以Java作为编程语言,实现了这样一个多线程Web服务器,这为我们提供了深入理解网络通信、Java多线程以及HTTP协议的机会。 首先,我们要明白Java在Web开发中的角色。Java以其跨平台的特性,广泛应用于服务器端...

    java读取PDF显示于浏览器

    例如,使用流式处理减少内存占用,或者使用多线程处理多个请求。 综上所述,实现“Java读取PDF显示在浏览器”涉及到PDF处理库的选择,浏览器的兼容性,服务器与浏览器之间的数据传输,以及安全性与用户体验的考虑等...

    java实现pdf上传,下载,在线预览,删除,修改等功能

    比如,缓存预览图片以减少重复生成,使用多线程处理大文件,以及使用适当的文件存储策略以减少I/O开销。 总之,实现上述功能需要对Java Web开发、文件处理、PDF格式以及安全性有深入理解。结合XPDF和其他相关的Java...

    java后端调用hightchars生成图片

    为了提升效率,可以考虑优化渲染引擎的配置、减少不必要的计算、或者采用多线程并行处理多个请求。 5. **错误处理**:在服务端处理过程中,可能会遇到各种问题,比如数据格式错误、渲染失败等,因此需要完善错误...

    java使用OpenOffice实现的Excel转pfd

    7. **性能优化**:如果需要批量转换大量文件,可以考虑使用多线程技术,或者利用OpenOffice支持的批处理模式,以提高转换效率。 8. **兼容性问题**:虽然OpenOffice对大多数Excel文件格式有良好的支持,但可能会...

    Core Java( Java 核心) PDF 教材

    6. **多线程编程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口、synchronized关键字、volatile属性以及线程池。这部分内容对于开发高性能、高并发的应用至关重要。 7. **输入/输出流**:Java的I/O流...

    Java学习从入门到精通.pdf

    这些是商业级的Java应用服务器,它们提供了更多的企业级特性,如负载均衡、集群、事务管理等。 除了JDK和服务器软件,文档中还提及了与Java相关的其他资源,例如O'Reilly出版社提供的Java学习书籍,如《Thinking in...

    springboot实现根据指定pdf、word模板文件填充值到文件里面,生成对应的文件

    根据性能需求,可能还需要进行优化,比如缓存模板或使用多线程处理批量请求。 总的来说,这个项目结合了Spring Boot的便利性、Apache POI对Word的处理能力和iText对PDF的处理能力,实现了根据模板动态生成定制化...

    基于JAVA试卷自动生成系统设计与研究.pdf

    本系统采用了MY SQL网络数据库对数据进行统一管理,MY SQL是一个真正的多用户、多线程SQL数据库服务器,极大的满足多位教师并发访问数据库的需要。 系统的设计思想主要基于JAVA、JSP、JavaBeans、XML、MYSQL等新...

    java教程.pdf

    - 多线程:Java语言内置对多线程编程的支持,允许程序同时执行多个任务。 3. Java版本: - Java 1.1版本是早期的版本,为Java语言提供了一些基本的特性。 - Java 1.2版本引入了一些新的特性和包,例如Swing图形用户...

    Java核心技术 卷 I+卷II 第11版 最新英文版 pdf

    7. **多线程**:讲解并发编程基础,如线程的创建、同步、线程池和并发工具类。 8. **枚举与注解**:介绍Java 5引入的新特性,如枚举类型和元注解。 卷II《Advanced Features》则聚焦于Java的高级特性: 1. **图形...

    JAVA 快速查询手册(PDF).rar

    6. **多线程**:Java内置对多线程的支持,使得开发者可以创建并管理多个执行线程,提高程序的并发性能。 7. **网络编程**:Java提供了丰富的API用于网络编程,如Socket和ServerSocket,可用于创建客户端和服务器...

    Svf_Connect_JavaAPI_70.pdf

    这尤其适合在多线程的Java环境下运行,如Servlets的Web环境,并且可以通过导入“svfrclient.jar”轻松实现接口调用。 当使用Svf_Connect_JavaAPI创建PDF时,生成的PDF文件将被返回至调用的原点——应用服务器,因此...

    浅析Java语言中线程的生命周期及实现方式.pdf

    浅析Java语言中线程的生命周期及实现方式 Java语言中的线程(Thread)是指在同一个进程中可以并发执行的多个控制流程。线程是Java语言中定义的非常重要...了解线程的生命周期和实现方式是Java语言中多线程开发的基础。

Global site tag (gtag.js) - Google Analytics