`
linyu19872008
  • 浏览: 281209 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于JAVA线程池

 
阅读更多

最近学习了JAVA线程池,应用最多的线程池一般有三种 newSingleThreadExecutor、newFixedThreadPool、newCachedThreadPool

 

newSingleThreadExecutor  创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

 

newFixedThreadPool  创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

 

newCachedThreadPool  创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

 

newSingleThreadExecutor  单线程池一般用于并发量不大的环境中

newCachedThreadPool   无边界线程池无疑要慎用,不然耗尽资源造成宕机后果无疑很严重

所以我推荐用newFixedThreadPool  有边界的线程池,实际大小可以根据生产环境加以调整,再加上一些拒绝任务的处理,在高并发的环境中无疑是非常好用的。

 

一下便是以newSingleThreadExecutor  做的例子

 

工作线程

public class TestThread extends Thread {

	@Override
	public void run() {

		 TestThreadPool.testCount.addAndGet(1l);
//		System.out.println(i);

	}

}

 

 

线程池

public class TestThreadPool {

	// public static int testCount = 0;
	public static AtomicLong testCount = new AtomicLong(0);
	public static AtomicLong rejectCount = new AtomicLong(0);

	private int corePoolSize = 30;
	private int maximumPoolSize = 60;
	private long keepAliveTime = 5l;
	private TimeUnit unit = TimeUnit.SECONDS;
	// private BlockingQueue<Runnable> workQueue = new
	// LinkedBlockingQueue<Runnable>(
	// 20);
	private BlockingQueue<Runnable> workQueue = new SynchronousQueue<Runnable>();

	// private ThreadPoolExecutor executor = new
	// ThreadPoolExecutor(corePoolSize,
	// maximumPoolSize, keepAliveTime, unit, workQueue);

	private ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize,
			maximumPoolSize, keepAliveTime, unit, workQueue,
			new ThreadRejectHandler());

	public static void main(String[] args) {
		int circle = 1000000;

		long start = Calendar.getInstance().getTimeInMillis();
		TestThreadPool test = new TestThreadPool();
		for (int i = 0; i < circle; i++) {
			try {
				test.executor.execute(new TestThread());
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

		for (;;) {
			if ((testCount.get() + rejectCount.get()) == Long.valueOf(circle)) {
				System.out.println("testCount:" + testCount);
				break;
			}
		}
		long end = Calendar.getInstance().getTimeInMillis();
		System.out.println("耗时:[" + (end - start) + "] 毫秒");
		test.executor.shutdownNow();

	}
}

 

拒绝任务处理器

public class ThreadRejectHandler implements RejectedExecutionHandler {

	@Override
	public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {

		System.out.println("任务被拒绝:"+TestThreadPool.rejectCount.addAndGet(1l));
		// 在这里做拒绝任务的处理
	}

}

 

 

启动类为《线程池类TestThreadPool 》,可以根据机器的配置调节circle参数的大小进行测试

 

我这里设置了circle为 1000000,  测试结果如下:

 

任务被拒绝:1

 

任务被拒绝:2

 

。。。。。。。。。。。。。此处略去N字

 

任务被拒绝:259

 

任务被拒绝:260

 

testCount:999740

 

耗时:[3266] 毫秒

 

 =======================================================================

 

使用线程池的优势:

因为通常情况下,创建线程是需要一定的耗时的,设这个时间为T1,而线程处理任务的时间为T2,而销毁线程的时间为T3,当T1>>T2时,同时T3时间也是一个需要考虑的参数,我们就应当考虑一种策略或者机制来控制,避免因为T1和T3这种无用的时间过多的占用资源。

所以线程池在高并发的环境中的优势是不言而喻的

 

分享到:
评论

相关推荐

    java线程池完整代码

    标题 "Java 线程池完整代码" 表明了这篇文章的主题是关于 Java 线程池的完整实现代码,涵盖了线程池的基本概念、配置文件的解析、线程池的创建和管理等方面。 描述解析 描述 "Java 线程池完整源码" 说明了这篇文章...

    java线程池使用后到底要关闭吗

    java线程池使用后到底要关闭吗 java线程池是一种高效的并发编程技术,可以帮助开发者更好地管理线程资源,提高系统的性能和可靠性。然而,在使用java线程池时,一个常见的问题是:使用完线程池后到底要不要关闭?...

    Java简单线程池 线程池中文文档

    简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类

    java线程池封装j

    Java线程池是一种高效管理线程的技术,它允许开发者预定义一组线程,根据任务的需要灵活调度,而不是每次需要执行任务时都创建新的线程。这种设计模式大大提高了系统的性能,减少了系统资源的消耗,特别是在高并发...

    一个通用的Java线程池类

    2.然后根据提示运行java命令执行示例程序,观看线程池的运行结果 目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来...

    java线程池知识.ppt

    java线程池知识、

    50879510A6_Java线程池_funbde_

    `funbde`可能是指作者的名字或者是某个特定功能的代号,由于描述中提到“不是整一个项目,仅供参考”,我们可以理解为这是一个关于Java线程池的示例代码或片段,用于演示线程池的基本用法或者特定的线程池配置和优化...

    基于Java线程池技术实现Knock Knock游戏项目.zip

    基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池...

    java线程池实例详细讲解

    Java线程池是一种高效管理线程资源的工具,它能够帮助开发者有效地控制并调度线程,从而提升系统性能,减少系统资源的浪费。在Java中,`ExecutorService`接口是线程池的主要入口,它是`java.util.concurrent`包的一...

    Java 线程池.pptx

    讲述了java线程池的优点,参数,6种线程池的使用场景,线程池用到的handler,线程任务的提交方式等等。

    自定义实现Java线程池

    ### 自定义实现Java线程池 #### 一、概述 在深入探讨自定义Java线程池之前,我们先简要回顾一下线程池的基本概念及其重要性。线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动...

    Java线程池使用说明

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

    java线程池的源码分析.zip

    Java线程池是Java并发编程中的重要组成部分,它在多线程和高并发场景下扮演着关键角色。本文将深入探讨Java线程池的源码分析,并对比不同类型的线程池,以帮助开发者更好地理解和利用这一强大的工具。 首先,我们要...

    java技术学习-基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分)

    java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java...

    Java线程池与ThreadPoolExecutor.pdf

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

    Java 线程池.docx

    Java线程池是一种高效管理线程资源的工具,它的出现是为了应对多线程编程中频繁创建和销毁线程带来的性能开销以及资源消耗。在Java中,通过使用线程池,我们可以预先创建一定数量的线程,这些线程在空闲时可以被复用...

    java线程池实例

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

    Java 线程池的原理与实现

    Java线程池是一种高级的多线程处理框架,它是Java并发编程中非常重要的一个组件。线程池的原理和实现涉及到操作系统调度、内存管理和并发控制等多个方面。理解线程池的工作原理有助于优化程序性能,避免过度创建和...

    java 线程池实现多并发队列后进先出

    Java线程池是一种高效管理并发任务的机制,它允许开发者预先配置一定数量的线程,以便在处理多个并发任务时能有效地复用这些线程,从而避免了频繁创建和销毁线程带来的开销。在Java中,`java.util.concurrent`包下的...

Global site tag (gtag.js) - Google Analytics