`

Thread pools and work queues

    博客分类:
  • Java
 
阅读更多

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

    线程池(ThreadPools)在C++编程中是一个重要的多线程管理工具,它能够有效地管理和调度线程资源,从而提高程序的执行效率和并发性能。本文将深入探讨线程池的概念、工作原理以及在C++中的实现。 线程池的概念: ...

    ThreadPoolWithCameraPreview, 在Android上,使用threadpools提高性能的演示.zip

    ThreadPoolWithCameraPreview, 在Android上,使用threadpools提高性能的演示 带相机预览的ThreadPool下载演示应用在 Google Play 上。项目演示了如何使用 HandlerThread s 和 ThreadPool s 在后台线程的android API...

    SP6ex1ThreadPools

    SP6ex1ThreadPools

    VC_Thread_Pools.rar_Pools_VC线程池_vc 多线程_多线程多任务_线程池

    本资源“VC_Thread_Pools.rar”提供了在VC++ 6.0环境下实现线程池的一个实例,帮助开发者理解和应用线程池技术。 线程池是一种管理线程的机制,它预先创建一组线程,当有新的任务需要执行时,线程池会从已创建的...

    Effect of K Fertilization on Soil K Pools and Rice Response in an Intensive Cropping System in China

    在现代农业生产中,肥料的施用对于作物的产量和质量有着决定性的影响。特别是对于那些需求量大的作物,比如水稻,其对钾肥(K肥)的响应尤为显著。本文主要研究在集约化水稻种植系统下,钾肥对土壤钾库、水稻产量、...

    android.support.v4.util.Pools使用

    `android.support.v4.util.Pools`库提供了一种机制,帮助开发者有效地重用对象,从而节省内存并提高性能。这个库主要包含两种类型的池:`SynchronizedPool`和`SimplePool`,它们都是基于对象池的设计模式。 ### 1. ...

    Java-ThreadPools

    Java 线程池应用程序这个应用程序是作为我本科课程工作的一部分开发的,该课程称为基于性能的编程模块。 该模块主要关注 Java 中多线程应用程序的安全开发。 该作业专门研究了线程池和同步的概念。...

    ThreadPools.jl:改进了Julia中后台和非均匀任务的线程管理。 https上的文档

    ThreadPools.jl是一个简单的程序包,它公开了一些模仿Base.Threads.@threads , Base.map和Base.foreach宏和函数。这些宏(和基础API)处理内置函数并非总是很适合的情况: 用户希望远离主线程的一组任务 一组持续...

    pools.unitypackage

    自己写好的对象池,可以拿下来直接用,挺简单的哈,为什么要50个字的描述,能说清楚不久得了,希望改进XXXXXXXXXXXXXXXXXXXX

    Java Threads, 3rd Edition, Scott Oaks and Henry Wong

    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 ...

    Oracle Solaris 11.1 Memory and Thread Placement Optimization Dev

    - **Thread Pools**:线程池是一种管理线程资源的方法,它可以有效地复用线程,减少创建和销毁线程的开销,同时提供可调整的并发级别。 - **Thread Scheduling Policies**:了解不同的调度策略(如 FIFO, Round ...

    Java 2 核心技术 卷1&卷2 CHM版 英文版

    Multithreadingincluding the java.util.concurrent library, locks, condition objects, futures, thread pools, thread-safe collections, threads and Swing Collection classescollections framework, ...

    Windows System Programming, 4th Edition

    * 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...

    windows系统编程4th-en-2010-2-26版

    * 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

    标题"Preverifier.rar_Pools"暗示了这个工具或者库专注于对程序类池(Class Pools)中的方法进行预验证。类池是Java虚拟机(JVM)在编译期间创建的一个数据结构,它存储了类和接口的信息,包括常量、字段和方法。在...

    Memory Pools V1.2

    Memory Pools V1.2 可能是这个内存池管理库的最新版本,它提供了更高效、更可控的内存分配策略。 内存池的基本思想是预先在程序启动时或者运行时一次性申请一大块连续的内存空间,然后将这块内存分割成多个固定大小...

    Mastering C# Concurrency

    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 ...

    weblogic 连接数为5的限制破解角决方法

    在`&lt;thread-pools&gt;`下添加或修改相关属性,如最大线程数(`max-thread-count`)、最小线程数(`min-thread-count`)和线程等待队列长度(`work-manager`的`max-queue-length`)。例如: ```xml &lt;thread-pools&gt; ...

Global site tag (gtag.js) - Google Analytics