线程池 Executors 入门

原创 2013年12月04日 10:23:33

系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互。在这种情形下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存周期很短的线程时,更应该考虑使用线程池。

 

使用线程池可以有效地控制系统中并发线程的数量,当系统中包含大量并发线程时,会导致系统性能剧烈下降,甚至导致JVM崩溃,而线程池的最大线程数参数可以控制系统中并发线程数不超过此数。

 

从JAVA5开始新增了一个Executors工具类来产生线程池,它有如下几个静态工厂方法来创建线程池。

强烈建议程序员使用较为方便的 Executors 工厂方法 Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)、

Executors.newFixedThreadPool(int)(固定大小线程池)

Executors.newSingleThreadExecutor()(单个后台线程)

Executors.newScheduledThreadPool(int corePoolSize) 可以指定延迟后执行线程任务。

 

ExecutorService代表尽快执行线程的线程池(只要线程池中有空闲的线程,就立即执行线程任务),程序只要将一个Runnable对象或Callable对象(代表线程任务)提交给该线程,该线程就会尽快执行该任务

 

当用完一个线程池后,应该嗲用该线程池的shutdown()方法,该方法将启动线程池的关闭序列,调用shutdown()方法后的线程池不再接受新任务,但将以前所有已提交任务执行完。当线程池中的所有任务都执行完成后,池中的所有线程都会死亡;另外也可以调用线程池中的shutdownNow()方法来关闭线程池,该方法试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行任务列表。

 

package hb.threadpool;

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

public class FixedThreadPoolDemo {

	public static void main(String[] args) {
		
		ExecutorService es = Executors.newFixedThreadPool(2);
//		ExecutorService es = Executors.newCachedThreadPool();
		
		for (int i = 0; i < 10; i++) {
			final int count = i;
			//过两秒启动线程运行里面的run方法
			es.submit(new Runnable() {
				@Override
				public void run() {
					System.out.println(Thread.currentThread().getName() + "----------" + count);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			});
		}
		
		System.out.println(es.isShutdown());
		//等待线程运行完毕之后再停止线程。
		es.shutdown();
		//强制停止线程,如果当前线程正在执行,则被强制停止。
//		es.shutdownNow();
		System.out.println(es.isShutdown());
		
	}

}
 

 

package hb.threadpool;

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

public class ScheduledThreadPoolExecutorDemo {

	public static void main(String[] args) {

//		ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(2);
		ScheduledExecutorService stpe = Executors.newScheduledThreadPool(2);;
		
		for (int i = 0; i < 10; i++) {
			final int count = i;
			//过两秒启动线程运行里面的run方法
			stpe.schedule(new Runnable() {
				@Override
				public void run() {
					System.out.println(Thread.currentThread().getName() + "----------" + count);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}, 2, TimeUnit.SECONDS);
		}
		
		System.out.println(stpe.isShutdown());
		//等待线程运行完毕之后再停止线程。
		stpe.shutdown();
		//强制停止线程,如果当前线程正在执行,则被强制停止。
//		stpe.shutdownNow();
		System.out.println(stpe.isShutdown());
		

	}

}

 

 

Java线程池详解:ThreadPoolExecutor、Executors

在操作系统中,线程是一个非常重要的资源,频繁创建和销毁大量线程会大大降低系统性能。Java线程池原理类似于数据库连接池,目的就是帮助我们实现线程复用,减少频繁创建和销毁线程。ThreadPoolExe...
  • xiao__gui
  • xiao__gui
  • 2016年04月05日 14:04
  • 2507

线程池作用及Executors方法讲解

线程池作用及Executors方法讲解
  • dong_19890208
  • dong_19890208
  • 2016年01月07日 11:12
  • 495

Executors创建线程池的弊端

Executors创建线程池的弊端 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式, 这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风...
  • admin1973
  • admin1973
  • 2017年12月01日 13:44
  • 247

Executors与ThreadPoolExecutor(阿里发布的 Java开发手册中强制线程池不允许使用 Executors 去创建)

最近阿里发布的 Java开发手册中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗...
  • qq_33300570
  • qq_33300570
  • 2017年10月30日 16:14
  • 1015

java源码分析系列一 线程池Executors

用了线程池已经有一段时间了,以前只是偶尔看看源码,了解了其中调度策略,没有深入研究。因为平常没有遇见什么问题。但是作为一个程序员要严格要求自己,做到未雨绸缪废话不说了,开始我们的源码之旅!      ...
  • yangchangji
  • yangchangji
  • 2017年01月12日 20:20
  • 1475

黑马程序员,用Executors来创建三种java的自带线程池

今天看视频自学了java线程池,如果学习线程池的具体实现方法,在ExecutorService中有许多函数要重写,许多参数我也不太懂,所以我只是看了Executors类中三个工厂方法来创建线程池。 1...
  • u012605440
  • u012605440
  • 2014年12月24日 23:17
  • 887

Java Executors 和 ThreadPoolExecutor 线程池

Executors提供四种线程池,分别为: newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。线程池为无限大,当执...
  • xlxxcc
  • xlxxcc
  • 2016年08月04日 00:21
  • 2302

Java 并发:Executors 和线程池(不错)

本文译自:Java Concurrency – Part 7 : Executors and thread pools 让我们开始来从入门了解一下 Java 的并发编程。 本文主要介绍如何开始创建...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2016年05月16日 20:53
  • 1698

Java通过Executors提供四种线程池

Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 new...
  • mack415858775
  • mack415858775
  • 2016年05月26日 17:03
  • 2075

Executors类中创建线程池的几种方法的分析

Executors类中创建线程池的几种方法的分析要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂...
  • u010412719
  • u010412719
  • 2016年09月09日 18:39
  • 1274
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程池 Executors 入门
举报原因:
原因补充:

(最多只允许输入30个字)