java线程池介绍与使用

在同等数量级的操作下,使用线程池的效率要远远高于单线程。线程池可以降低创建线程带来的开销。而线程池中的线程结束后进行的是回收操作而不真的将线程销毁。而在这个过程过,线程池带来的内存消耗肯定会大于单线程。在使用线程池的时候要慎重这个问题。下面进行两个方法,分别来测试下。

import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadpoolDemo1 {

	static void useThreadPool(int count) {
		//定义存储集合
		final List<Integer> list = new LinkedList<Integer>();
		long startTime = System.currentTimeMillis();

		ThreadPoolExecutor tpe = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(count) );
		//产生随机数
		final Random random = new Random();
		for (int i=0; i < count; i++) {
			tpe.execute(new Runnable() {

				@Override
				public void run() {
					list.add(random.nextInt());

				}
			});
		}

		tpe.shutdown();
		try {
			tpe.awaitTermination(1, TimeUnit.DAYS);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println(System.currentTimeMillis() - startTime);

		System.out.println(list.size());
	}

	static void useOneThread(int count){
		final List<Integer> list = new LinkedList<Integer>();
		long startTime = System.currentTimeMillis();
		//产生随机数
		final Random random = new Random();
		for (int i=0; i<count; i++) {
			Thread thread = new Thread(){
				public void run() {
					list.add(random.nextInt());

				}
			};
			thread.start();
			try {
				thread.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println(System.currentTimeMillis() - startTime);

		System.out.println(list.size());
	}

	public static void main(String[] args) {
		useThreadPool(20000);
		useOneThread(20000);
	}
}

在count参数为同值的时候,使用线程池会比单独创建线程的速度要快好几倍。

使用线程池的好处:

1)减少了创建和销毁线程的次数,线程可以被重复利用

2)线程池中的线程可以被程序员调节。减少系统内存的消耗。

线程池的使用:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolDemo2 {

	// 创建一个可重复利用的单线城池
	private void testSingleThreadExecutor() {
		ExecutorService pool = Executors.newSingleThreadExecutor();
		Thread t1 = new MyThread();
		Thread t2 = new MyThread();
		Thread t3 = new MyThread();

		pool.execute(t1);
		pool.execute(t2);
		pool.execute(t3);

		pool.shutdown();
	}

	// 创建一个固定大小的线程池
	private void testFixedThreadPool() {
		ExecutorService pool = Executors.newFixedThreadPool(3);
		Thread t1 = new MyThread();
		Thread t2 = new MyThread();
		Thread t3 = new MyThread();

		pool.execute(t1);
		pool.execute(t2);
		pool.execute(t3);

		pool.shutdown();
	}

	// 创建具有定时功能的线程池
	private void testScheduledThreadPoolExecutor() {
		ScheduledThreadPoolExecutor poolExecutor = new ScheduledThreadPoolExecutor(1);
		poolExecutor.scheduleAtFixedRate(new Runnable() {
			// 每隔一段时间就触发异常
			@Override
			public void run() {
				// throw new RuntimeException();
				System.out.println("================");
			}
		}, 1000, 5000, TimeUnit.MILLISECONDS);
		poolExecutor.scheduleAtFixedRate(new Runnable() {
			// 每隔一段时间打印系统时间,证明两者是互不影响的
			@Override
			public void run() {
				System.out.println(System.currentTimeMillis());
			}
		}, 1000, 2000, TimeUnit.MILLISECONDS);
	}

}

ThreadPoolExecutor:

创建ThreadPoolExecutor的参数:

corePoolSize: 池中所保存的线程数,包括空闲线程。

maximumPoolSize:池中允许的最大线程数。

keepAliveTime:当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。

Unit:keepAliveTime 参数的时间单位。

workQueue:执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。

threadFactory:执行程序创建新线程时使用的工厂。

Handler:由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。

时间: 2024-12-05 02:39:13

java线程池介绍与使用的相关文章

Java线程池介绍

Java线程池介绍 2015-10-24 ImportNew (点击上方公号,可快速关注) 原文:allegro 译文:ImportNew - paddx 链接:http://www.importnew.com/16845.html 根据摩尔定律(Moore’s law),集成电路晶体管的数量差不多每两年就会翻一倍.但是晶体管数量指数级的增长不一定会导致 CPU 性能的指数级增长.处理器制造商花了很多年来提高时钟频率和指令并行.在新一代的处理器上,单线程程序的执行速率确实有所提高.但是,时钟频率

Java线程池的原理及几类线程池的介绍

刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所花的时间以及系统资源的开销 如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及"过度切换". 线程池工作原理: 为什么要用线程池? 诸如 Web 服务器.数据库服务器.文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务.请求以某种方式到

Java 线程池(一):开篇及Executor整体框架介绍

一.开篇 线程池.数据库连接池,在平时的学习中总能接触到这两个词,但它们到底是什么?和线程,数据库连接有什么关系?为什么需要“池”?“池”的概念及作用是什么?要弄清楚这些问题,就要深入到“池”的实现中去. 之前找实习工作时,时常有面试官问这类问题,自己平时知道如何使用Java的Executor线程池框架,但是具体的细节还真没感受,所以打算开始试着研究一下Executor线程池框架. 废话到此打住,正式开始! 二.Executor整体框架 让我们先站在一个较高的角度俯视一下Java线程池的整体结构

Java线程池使用说明

Java线程池使用说明 一 简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的问题提供了非常大的帮助. 二:线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量.     根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少

java线程池原理及实现方式

线程池的定义 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程 为什么要使用线程池 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.在一个 JVM 里创建太多的线程可能会导致系统由于过度消耗内存而用完内存或"切换过度".为了防止资源不足,服务器应用程序需要一些办法来限制任何给定时刻处理的请求数目. 线程池组成部分 1.线程池管理器(ThreadPoolManager):用于创建并管理线程池,包括 创建线程池,销

Java 线程池的原理与实现

最近在学习线程池.内存控制等关于提高程序运行性能方面的编程技术,在网上看到有一哥们写得不错,故和大家一起分享. [分享]Java 线程池的原理与实现 这几天主要是狂看源程序,在弥补了一些以前知识空白的同时,也学会了不少新的知识(比如 NIO),或者称为新技术吧.线程池就是其中之一,一提到线程,我们会想到以前<操作系统>的生产者与消费者,信号量,同步控制等等.一提到池,我们会想到数据库连接池,但是线程池又如何呢? 建议:在阅读本文前,先理一理同步的知识,特别是syncronized同步关键字的用

Java 线程池学习

Reference: <创建Java线程池>[1],<Java线程:新特征-线程池>[2], <Java线程池学习>[3],<线程池ThreadPoolExecutor使用简介>[4],<Java5中的线程池实例讲解>[5],<ThreadPoolExecutor使用和思考>[6] [1]中博主自己通过ThreadGroup实现一个线程池(挺方便理解的),使用的是jdk1.4版本,Jdk1.5版本以上提供了现成的线程池. [2]中介绍

JAVA线程池的分析和使用

http://www.infoq.com/cn/articles/java-threadPool/ 1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控.但是要做到合理的利用线程池,必须对其原理了如指掌. 2. 线程池

Java线程池ThreadPoolExector的源码分析

前言:线程是我们在学习java过程中非常重要的也是绕不开的一个知识点,它的重要程度可以说是java的核心之一,线程具有不可轻视的作用,对于我们提高程序的运行效率.压榨CPU处理能力.多条线路同时运行等都是强有力的杀手锏工具.线程是如此的重要,那么我们来思考这样一个问题.假设我们有一个高并发,多线程的项目,多条线程在运行的时候,来一个任务我们new一个线程,任务结束了,再把它销毁结束,这样看似没有问题,适合于低并发的场景,可是当我们的项目投入到生产环境,一下涌入千条任务的时候,线程不断的new执行