`

使用util.concurrent.Executors创建ThreadPool

    博客分类:
  • Java
 
阅读更多

通过util.concurrent.Executors直接创建线程池,非常方便

 

package thread.pool;

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 使用线程池的好处:
 * 	线程池维护一定数量的worker线程
 *  调用者只需将任务放入到线程池中即可
 *  具体任务的执行交给线程池中的线程去完成
 *  主要为了提高系统响应能力
 *  concurrent为并发提供支持,关注并发
 *  synchronized同步为共享资源安全使用提供支持,关注共享数据被正确操作
 */
class ThreadPool {
	
	private static ThreadPool pool = new ThreadPool();
	
	public static ThreadPool getThreadPool() {
		return pool;
	}
	
	final int nThreads = 5; 
	ExecutorService executor = null;
	
	//创建固定大小的线程池,线程池中的线程会不断被重用(当空闲时)
	private ThreadPool() {
		/**
		 * 始终维护固定数量的线程,线程在执行过程中由于错误导致终止,将会自动创建新的线程进行替补
		 */
		executor = Executors.newFixedThreadPool(nThreads);
		
		/**
		 * 任务数超过线程池中处理任务的线程数量时,会自动创建新的线程并加入到线程池中执行任务
		 * 线程数量会根据任务多少动态变化(自动创建新线程或释放多余的空闲线程)
		 */
		//executor = Executors.newCachedThreadPool();
		
		/**
		 * 线程池中只有唯一线程,即使发生错误导致线程终止(在shutdown()调用之前),线程池会自动创建一个新的线程进行替补
		 * 与newFixedThreadPool(1)不同的时,此方法返回的executor确保线程池不会被添加新的线程,始终只有一个,能实现任务执行的连续性/前后性
		 */
		//executor = Executors.newSingleThreadExecutor();
	}
	
	public ThreadPool addTask(Runnable task) {
		executor.execute(task);
		return this;
	}
	
	public void shutdown() {
		executor.shutdown();
	}
}

/**
 * 封装任务
 */
class Task implements Runnable {
	//统计每个线程总共执行了多少个任务
	private static ThreadLocal<Integer> dealTaskCount = new ThreadLocal<Integer>();
	
	private String taskName;
	
	public Task(String taskName) {
		this.taskName = taskName;
	}
	public void run() {
		Integer taskCount = dealTaskCount.get();
		taskCount = taskCount==null? 1 : ++taskCount;
		dealTaskCount.set(taskCount);
		
		System.out.println(Thread.currentThread().getName() + " dealing task: " + taskName +", complete task:" + taskCount);
		try {
			Thread.sleep(new Random().nextInt(100));
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

//Test
public class Concurrent_ThreadPool {

	public static void main(String[] args) {
		
		ThreadPool pool = ThreadPool.getThreadPool();
		
		//提交50个任务到线程池中
		for(int i=1;i<=50;i++) {
			pool.addTask(new Task("Task"+i));
		}
		
		//when server shutdown 
		pool.shutdown();
	}

}

 

分享到:
评论

相关推荐

    java.util.concurrent 学习ppt

    为了解决这些问题,Java.util.concurrent引入了线程池(ThreadPool)和任务调度。线程池允许预先创建一组线程,任务可以被提交到线程池而不是直接启动新线程,从而提高了效率和资源利用率。线程池可以通过...

    浅谈java.util.concurrent包中的线程池和消息队列

    java.util.concurrent.Executors提供了一个java.util.concurrent.Executor接口的实现用于创建线程池。线程池技术主要解决处理器单元内多个线程执行的问题,可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐...

    SimpleDateFormat线程不安全的5种解决方案.docx

    import java.util.concurrent.Executors; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SimpleDateFormatExample { private static SimpleDateFormat...

    java 写的定时器

    import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledExecutorExample { public static void main...

    java 张孝祥高级

    `java.util.concurrent.Executors`工厂类则是创建ExecutorService实例的便捷途径,它可以创建固定大小、单线程、缓存线程池等多种类型的ExecutorService。 学习这部分内容,你将掌握如何利用ExecutorService和...

    commons-poo ljar包

    import java.util.concurrent.Executors; public class ThreadPoolExample { public static void main(String[] args) { // 配置对象池 GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); ...

    Concurrent In java

    Java平台提供了丰富的并发编程工具,其中`java.util.concurrent`包尤其引人注目。这个包包含了多种并发容器和实用工具,能够帮助开发者轻松地编写出高性能且可维护的并发应用程序。本文将深入探讨`java.util....

    threadpool.zip

    在Java中,`java.util.concurrent`包提供了线程池的实现,其中`ExecutorService`接口是线程池的核心,`ThreadPoolExecutor`类是其主要实现。线程池的创建可以通过`Executors`类的静态工厂方法,例如`...

    Java版线程池ThreadPool.zip

    在Java中,`java.util.concurrent`包下的`ExecutorService`、`ThreadPoolExecutor`和`Executors`类提供了线程池的相关功能。 1. **ExecutorService接口**:这是Java并发框架的核心接口,它定义了创建、管理和执行...

    Android图片上传下载小框架

    import java.util.concurrent.Executors; public class SmartImageView extends ImageView { private static final int LOADING_THREADS = 4; private static ExecutorService threadPool = Executors....

    java线程学习

    - `Executors`工厂类提供多种创建线程池的方法,如`newFixedThreadPool`(固定大小线程池)、`newSingleThreadExecutor`(单线程线程池)等。 7. **Future和Callable** - `Callable`接口类似Runnable,但其`call...

    ThreadPoolStudy.rar

    线程池是多线程编程中的一个重要概念,它在Java中通过`java.util.concurrent`包中的`ExecutorService`和相关的接口、类实现。这个ThreadPoolStudy.rar文件可能包含了作者对线程池深入研究的成果,特别是关于线程池的...

    ThreadPool2

    标题中的"ThreadPool2"指的是Java编程语言中的线程池实现,通常是指`java.util.concurrent.ThreadPoolExecutor`。线程池是多线程编程中的一个重要概念,它管理一组可重用的工作线程,用于执行提交的任务,提高了系统...

    Eclipse开发部署在Websphere的Socket服务器端应用

    import java.util.concurrent.Executors; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class SocketListener implements ServletContextListener { private ...

    java线程池

    Java标准库中的`java.util.concurrent`包提供了强大的线程池功能支持,主要由`ExecutorService`接口及其实现类`ThreadPoolExecutor`和`Executors`工具类提供。 #### 二、Java线程池的三种类型 根据不同的应用场景...

    threadpool ultimate version

    "threadpool ultimate version" 指的可能是一个经过优化和增强的线程池实现,它旨在提高系统性能,减少线程创建和销毁的开销,并确保系统的稳定性和资源效率。 线程池的基本思想是预先创建一定数量的线程,这些线程...

    ThreadPoolDemo

    为了解决这些问题,Java提供了线程池(ThreadPool)的概念,它是Java并发编程中的重要组成部分,主要由`java.util.concurrent`包下的`ExecutorService`接口及其实现类来支持。 线程池的核心概念包括线程复用、任务...

    Java并发编程Semaphore计数信号量详解

    import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreLearn { //信号量总数 private static final int SEM_MAX = 12; public static void main(String[] ...

    ThreadPool的实现

    描述中提到的博客链接(由于实际无法访问,这里将基于一般线程池实现进行解释)可能详细解析了Java的`java.util.concurrent.ThreadPoolExecutor`类,它是Java标准库提供的线程池实现。这个类提供了丰富的参数来定制...

Global site tag (gtag.js) - Google Analytics