`

资源与效率:Java线程池

 
阅读更多

一、前言

 

在软件开发过程中,总会遇到一些瓶颈。开发效率瓶颈,人员技术瓶颈,运行效率瓶颈,服务器瓶颈,磁盘IO瓶颈,CPU、内存瓶颈。这些都限制了我们的软件无法尽善尽美。我们的目的就是为了克服和改善这些难题,使软件比想象中更完美。

 

二、具体问题

 

在数据库或者是流程工作时,很多操作都是由于最初软件设计的原因,或者是当初一些产品设计的原因,或者因为时间紧迫,或者逼不得已必须如此做,然后被设计成同步操作,导致工作效率产生瓶颈,没有充分发挥CPU和内存的功能,但是软件工作起来慢的要死。这时候就需要重构代码了。

 

三、解决方案

 

在CPU和内存还有磁盘IO并没有充分利用的时候,就可以在重构的时候,使用线程操作,将过去需要占用一定时间的同步操作,进行并发处理。这样,创建多个线程来解决同一个问题。这样就可以使操作成为异步,不需要进行等待就可以同时操作很多事情。

那么线程需要创建多少呢?

每监听到一个请求就创建一个线程,然后操作之后就销毁。这种办法可行么?

 

如果突然在客户端提交了1000000 * N 个请求,这些请求都进入服务器,然后在这里,为每一个请求都创建一个线程来执行。这样程序就会失去控制。最终挤爆服务器CPU和内存,使程序崩溃。

 

怎么样合理、可控的处理操作,变成了重点。

 

四、线程池的概念

 

线程池,顾名思义,在池化开发的现在,如数据库连接池这种开发模式已经广泛流行。

在池中创建连接实例,在访问数据库时,从连接池中取得连接,操作之后归还。这样就可以有效的限制资源数量,但是又能提高操作速度。

 

五、编码示意

1.package test.dao;   
2.  
3.import java.util.LinkedList;   
4.  
5.import org.apache.log4j.Logger;   
6.  
7.  
8./**  
9. *   
10. * @author Andy.xiaomeng  
11. *  
12. */  
13.public class ThreadPool {   
14.  
15.    private static final Logger Log = Logger.getLogger(ThreadPool.class);   
16.       
17.    private ThreadWorker[] worker;   
18.    private LinkedList<Runnable> queue;   
19.    private int poolSize;   
20.       
21.    public int getPoolSize(){   
22.        return poolSize;   
23.    }   
24.       
25.    //initialize thread pool with pool size   
26.    public ThreadPool(int size){   
27.           
28.        poolSize = size;   
29.        worker = new ThreadWorker[size];   
30.        queue = new LinkedList<Runnable>();   
31.           
32.        for (int i = 0; i < size; i++) {   
33.            worker[i] = new ThreadWorker();    
34.            worker[i].start();   
35.        }   
36.           
37.    }   
38.       
39.       
40.       
41.    //add work queue   
42.    public void addQueue(Runnable runnable){   
43.        synchronized(queue) {   
44.            queue.add(runnable);   
45.            queue.notify();   
46.        }   
47.    }   
48.       
49.    //worker do work   
50.    private class ThreadWorker extends Thread{   
51.           
52.        public void run(){   
53.               
54.            //runnable   
55.            Runnable runable;   
56.               
57.            while (true) {   
58.                   
59.                synchronized(queue) {   
60.                    while (queue.isEmpty()) {   
61.                        try  
62.                        {   
63.                            //is work queue is empty, wait   
64.                            queue.wait();   
65.                        }   
66.                        catch (Exception e)   
67.                        {   
68.                            Log.error("pool queue wait", e);   
69.                        }   
70.                    }   
71.                       
72.                    //get work in queue, and remove it    
73.                    runable = queue.removeFirst();   
74.                }   
75.  
76.                try {   
77.                    //do work   
78.                    runable.run();   
79.                }   
80.                catch (RuntimeException e) {   
81.                    Log.error("unknow runtime exception", e);   
82.                }   
83.                   
84.            }   
85.        }   
86.           
87.    }   
88.       
89.    public static void main(String[] args) {   
90.           
91.        //test   
92.        ThreadPool pool = new ThreadPool(111);   
93.           
94.           
95.        //   
96.        class SSS implements Runnable{   
97.            private String abc;   
98.            public void setAbc(String aaaaa){   
99.                this.abc = aaaaa;   
100.            }   
101.               
102.            public void run() {   
103.                System.out.println("do runnable " + abc);   
104.            }   
105.        }   
106.           
107.        for (int i = 0; i < 200; i++) {   
108.            SSS a = new SSS();   
109.            a.setAbc(String.valueOf(i + 1));   
110.            pool.addQueue(a);   
111.        }   
112.           
113.    }   
114.}  

 

 附带了main方法的测试案例。

 

 首先创建线程池对象,设置创建线程数量。

 

 将需要做的事情,封装成一个Runnable ,然后添加到队列中。

 

 队列通知线程执行操作。

分享到:
评论

相关推荐

    JAVA线程池例子

    Java线程池是一种高效管理线程资源的技术,它允许开发者创建一组可重用的工作线程,从而避免频繁地创建和销毁线程带来的性能开销。线程池在Java中主要通过`java.util.concurrent`包中的`ExecutorService`接口及其...

    Java线程池使用说明

    Java线程池是Java并发编程中的重要组件,它能够有效地管理和复用线程,从而提高程序的执行效率和降低资源消耗。在JDK 1.5版本之前,Java对线程池的支持非常有限,而在JDK 1.5之后,加入了java.util.concurrent包,...

    java线程池实例

    Java线程池是一种高效管理线程资源的工具,它通过维护一组可重用的线程来减少创建和销毁线程的开销。在Java中,`java.util.concurrent`包提供了`ExecutorService`接口和它的实现类,如`ThreadPoolExecutor`,来支持...

    50879510A6_Java线程池_funbde_

    学习和理解Java线程池,不仅能够提升多线程编程的效率,还能帮助我们更好地控制系统的并发行为,防止过多的线程导致系统资源耗尽。因此,深入研究线程池的工作原理和使用方式,对于任何Java开发者来说都是十分必要的...

    java线程池的源码分析.zip

    Java线程池是Java并发编程中的重要组成...通过深入研究Java线程池的源码,我们可以更好地控制并发任务的执行,优化系统性能,同时避免潜在的资源浪费和线程安全问题。理解并熟练运用线程池是每个Java开发者必备的技能。

    Java线程池与ThreadPoolExecutor.pdf

    Java线程池是Java并发编程中的重要组成部分,它允许开发者管理多个线程并有效地调度任务。线程池通过ThreadPoolExecutor类实现,这是一个高度可配置的工具,能够根据具体需求定制线程的创建、管理和销毁策略。 ...

    Java线程池文档

    总之,Java线程池是Java多线程编程中不可或缺的一部分,通过合理的线程池配置,可以显著提升程序的并发性能和资源利用率。在理解和使用线程池时,不仅要关注其实现原理,还需要根据实际需求调整线程池的配置,以达到...

    java 四种线程池实例

    总之,Java线程池提供了一种强大的工具来管理和优化并发任务的执行,理解并熟练使用各种线程池实例能够显著提升程序的效率和可维护性。在设计系统时,应该充分考虑线程池的选择和配置,以适应不同类型的异步任务需求...

    java 线程池

    ### Java线程池详解 #### 一、线程与线程池的概念 在Java中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程(例如某个Java应用)至少有一个线程,如果线程...

    JAVA线程池原理以及几种线程池类型介绍.doc

    Java线程池是一种高效管理线程的工具,它允许开发者预先创建一组线程,并复用它们来处理任务,从而降低了创建和销毁线程的开销。线程池的使用尤其适用于处理大量短小任务的场景,例如Web服务器、数据库服务器等。在...

    Java版线程池实现

    Java线程池是一种高效管理并发任务执行的机制,它通过预先创建并维护一定数量的线程,从而避免了频繁地创建和销毁线程所带来的性能开销。在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`...

    JAVA使用线程池查询大批量数据

    在Java开发中,处理大批量数据时,合理利用线程池可以显著提高程序的执行效率和资源利用率。本文将深入探讨如何在Java中使用线程池来查询大量数据,以及这样做的好处和实现方法。 首先,理解线程池的概念至关重要。...

    简单线程池与线程池检查的实现

    5. 销毁线程池:当线程池不再需要时,可以安全地关闭线程池,释放资源。 线程池检查是确保线程池高效、稳定运行的重要手段,主要检查以下几个方面: 1. 线程池状态:检查线程池是否正常运行,是否存在过多的阻塞...

    Java线程池技术详解

    【Java线程池技术详解】 线程池是Java并发编程中的一个重要概念,它是一种线程使用模式,旨在优化线程的管理和使用,提高系统资源的利用率。线程池的引入是为了应对频繁创建和销毁线程所带来的性能开销,因为创建和...

    JAVA线程池原理以及几种线程池类型介绍

    ### JAVA线程池原理及几种线程池类型的详细介绍 #### 一、线程池的引入背景及重要性 在现代软件开发中,特别是在基于Java的应用程序设计中,线程池技术已经成为提高系统性能和资源利用率的关键手段之一。线程池...

    基于Java线程池技术的数据爬虫设计与实现.pdf

    本文所提及的基于Java线程池技术的数据爬虫设计与实现,不仅涉及到了数据爬虫的原理和架构,还包括了多线程编程的知识点,以及线程池技术在数据爬虫中的具体应用。 首先,数据爬虫的基本原理是模拟用户的点击行为,...

    Java实现通用线程池

    1. 创建线程池:使用ThreadPoolExecutor类创建线程池,设置线程池的核心线程数、最大线程数和keepAliveTime等参数。 2. 提交任务:将任务提交给线程池,线程池会自动选择空闲线程执行任务。 3. 监控线程池:使用...

    Java并发编程:线程池的使用 - 平凡希 - 博客园1

    Java并发编程中的线程池是提高系统效率的关键工具,它解决了频繁创建和销毁线程的问题。线程池通过复用已存在的线程来处理任务,从而避免了每次任务执行完毕后销毁线程的开销。在Java中,线程池的核心实现是`java....

    ThreadPool:Java 线程池的使用 例子

    所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因。比如大家...

    Java实现的线程池、消息队列功能

    标题中的“Java实现的线程池、消息队列功能”是指在Java编程中,如何利用编程技术实现线程池和消息队列这两种重要的并发处理机制。线程池和消息队列是解决多线程环境下资源管理和任务调度的有效手段,它们在高并发、...

Global site tag (gtag.js) - Google Analytics