http://www.ibm.com/developerworks/library/j-jtp0730/index.html
线程池的原理:
1. 内部维护若干个线程,这些线程一直保持运行/阻塞状态;
2. 维护一个队列,通过锁的方式让这些线程从队列中取任务;
3. 如果队列没有任务,则阻塞当前请求任务的线程;
4. 当有新的任务加入到任务队列时,唤醒与锁绑定的等待集中的线程
这就是线程池最基本的原理!
package thread; import java.util.LinkedList; public class WorkQueue { private final int nThreads; private final PoolWorker[] threads; private final LinkedList queue; public WorkQueue(int nThreads) { this.nThreads = nThreads; threads = new PoolWorker[nThreads]; queue = new LinkedList(); for(int i=0; i<nThreads; i++) { threads[i] = new PoolWorker("worker-" + i); threads[i].start(); System.out.println(threads[i].getName()+" starts to work"); } } //面向接口进行设计,只要是实现Runnable接口的任务都可以被接收 public void execute(Runnable task) { synchronized(queue) { queue.add(task); System.out.println("$$$ current tasks:" + queue.size()); queue.notify(); } } //worker的任务:处理任务队列 Task Queue 中的任务 private class PoolWorker extends Thread { public PoolWorker(String threadName) { super(threadName); } public void run() { Runnable task; for(;;) { synchronized (queue) { while(queue.isEmpty()) { try { System.out.println("there is no task! "+Thread.currentThread().getName() + " is waiting..."); queue.wait(); } catch (InterruptedException ignored) {} } //取出任务 task = (Runnable)queue.removeFirst(); } try{ task.run(); } catch(RuntimeException e) { //log something here } } } } }
package thread; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; /** * 实现Runnable表示此类为任务类 * */ public class FileSaver implements Runnable { private File file; public FileSaver(File file) { this.file = file; } @Override public void run() { try { long mills = new Random().nextInt(10000); Thread.sleep(mills); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); System.out.println(Thread.currentThread().getName() + ": Write file to disk at " + sdf.format(new Date()) + "--->" + file.getName() + ", takes " + mills + " ms"); } catch (InterruptedException e) { e.printStackTrace(); } } }
package thread; import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Random; public class Client { public static void main(String[] args) { //系统启动便初始化工作队列 WorkQueue queue = new WorkQueue(2); //模拟客户端请求 Random rand = new Random(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); int i = 1; while(true) { try { Thread.sleep(rand.nextInt(5000)); String fileName = "file"+(i++); System.out.println("One request arrive at " + sdf.format(Calendar.getInstance().getTime()) + ", fileName=" + fileName); File file = new File(fileName); FileSaver saver = new FileSaver(file); queue.execute(saver); } catch (InterruptedException e) { e.printStackTrace(); } } } }
相关推荐
线程池(ThreadPools)在C++编程中是一个重要的多线程管理工具,它能够有效地管理和调度线程资源,从而提高程序的执行效率和并发性能。本文将深入探讨线程池的概念、工作原理以及在C++中的实现。 线程池的概念: ...
ThreadPoolWithCameraPreview, 在Android上,使用threadpools提高性能的演示 带相机预览的ThreadPool下载演示应用在 Google Play 上。项目演示了如何使用 HandlerThread s 和 ThreadPool s 在后台线程的android API...
SP6ex1ThreadPools
本资源“VC_Thread_Pools.rar”提供了在VC++ 6.0环境下实现线程池的一个实例,帮助开发者理解和应用线程池技术。 线程池是一种管理线程的机制,它预先创建一组线程,当有新的任务需要执行时,线程池会从已创建的...
在现代农业生产中,肥料的施用对于作物的产量和质量有着决定性的影响。特别是对于那些需求量大的作物,比如水稻,其对钾肥(K肥)的响应尤为显著。本文主要研究在集约化水稻种植系统下,钾肥对土壤钾库、水稻产量、...
`android.support.v4.util.Pools`库提供了一种机制,帮助开发者有效地重用对象,从而节省内存并提高性能。这个库主要包含两种类型的池:`SynchronizedPool`和`SimplePool`,它们都是基于对象池的设计模式。 ### 1. ...
Java 线程池应用程序这个应用程序是作为我本科课程工作的一部分开发的,该课程称为基于性能的编程模块。 该模块主要关注 Java 中多线程应用程序的安全开发。 该作业专门研究了线程池和同步的概念。...
ThreadPools.jl是一个简单的程序包,它公开了一些模仿Base.Threads.@threads , Base.map和Base.foreach宏和函数。这些宏(和基础API)处理内置函数并非总是很适合的情况: 用户希望远离主线程的一组任务 一组持续...
自己写好的对象池,可以拿下来直接用,挺简单的哈,为什么要50个字的描述,能说清楚不久得了,希望改进XXXXXXXXXXXXXXXXXXXX
New chapters cover thread performance, using threads with Swing, threads and Collection classes, thread pools, and threads and I/O (traditional, new, and interrupted). Developers who cannot yet ...
- **Thread Pools**:线程池是一种管理线程资源的方法,它可以有效地复用线程,减少创建和销毁线程的开销,同时提供可调整的并发级别。 - **Thread Scheduling Policies**:了解不同的调度策略(如 FIFO, Round ...
Multithreadingincluding the java.util.concurrent library, locks, condition objects, futures, thread pools, thread-safe collections, threads and Swing Collection classescollections framework, ...
* Improving performance and scalability using threads, thread pools, and completion ports * Techniques to improve program reliability and performance in all systems * Windows performance-enhancing API...
* Improving performance and scalability using threads, thread pools, and completion ports * Techniques to improve program reliability and performance in all systems * Windows performance-enhancing API...
标题"Preverifier.rar_Pools"暗示了这个工具或者库专注于对程序类池(Class Pools)中的方法进行预验证。类池是Java虚拟机(JVM)在编译期间创建的一个数据结构,它存储了类和接口的信息,包括常量、字段和方法。在...
Memory Pools V1.2 可能是这个内存池管理库的最新版本,它提供了更高效、更可控的内存分配策略。 内存池的基本思想是预先在程序启动时或者运行时一次性申请一大块连续的内存空间,然后将这块内存分割成多个固定大小...
Further, you'll learn about server scalability, asynchronous I/O, and thread pools, and write responsive traditional Windows and Windows Store applications. By the end of the book, you will be able ...
在`<thread-pools>`下添加或修改相关属性,如最大线程数(`max-thread-count`)、最小线程数(`min-thread-count`)和线程等待队列长度(`work-manager`的`max-queue-length`)。例如: ```xml <thread-pools> ...