JDK线程池简介与使用


1、线程池简介

  • 为了不系统频繁的建立和销毁线程,咱们能够将建立的线程进行复用。数据库中的数据库链接池也是此意。Java中的线程池是运用场景最多的并发框架,几乎全部须要异步或并发执行任务的程序均可以使用线程池。在开发过程当中,合理地使用线程池可以带来如下好处:
  1. 第一:下降资源消耗。经过重复利用已建立的线程下降线程建立和销毁形成的消耗。
  2. 第二:提升响应速度。当任务到达时,任务能够不须要等到线程建立就能当即执行。
  3. 第三:提升线程的可管理性。线程是稀缺资源,若是无限制地建立,不只会消耗系统资源,还会下降系统的稳定性,使用线程池能够进行统一分配、调优和监控。可是,要作到合理利用线程池,必须对其实现原理了如指掌。
  • 在线程池中总有那么几个活跃的线程,也有必定的最大值限制,一个业务使用完线程以后,不是当即销毁而是将其放入到线程池中,从而实现线程的复用。简而言之:建立线程变成了从线程池获取空闲的线程,关闭线程变成了向池子中归还线程。

2、JDK对线程池的支持

  • 为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制。他们都在java.util.concurrent包中,时JDK并发包的核心。其中一个比较重要的类:Executors,扮演者线程工厂的角色,咱们经过Executors能够建立特定功能的线程池。 Executors建立线程池的方法:
  1. newFixedThreadPool()方法,该方法返回一个固定数量的线程池,该方法的线程数始终不变,当有一个任务提交时,若线程池中空闲,则当即执行,若没有,则会被暂缓在一个任务队列中等待有空闲的线程去执行。
  2. newSingleThreadExecutor()方法,建立一个线程的线程池,若空闲则执行,若没有空闲则暂缓在任务队列中。
  3. newCachedThreadPool()方法,返回一个可根据实际状况调整线程个数的线程池,不限制最大线程数量,若用空闲的线程则执行任务,若无则不建立线程。而且每个空闲线程会在60秒后自动回收。 4.newScheduledThreadPool()方法,该方法返回一个SchededExecutorService对象,但该线程池能够指定线程的数量。
  • 注:以上4中方法的本质内部底层都是实际建立的都是一个ThreadPoolExecutor对象,只是对ThreadPoolExecutor构造方法,进行了默认值的设定。
源码解读
  • 所以,在以上方法不足以供咱们使用时,能够本身定义线程池,构造方法以下:
public ThreadPoolExecutor(int corePoolSize, 
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory) {…}
  1. corePoolSize 核心线程数(表示线程池初始化的时候就存在多少个线程);
  2. maximumPoolSize 线程池最大容量大小;
  3. keepAliveTime 线程池空闲时,线程存活的时间;
  4. TimeUnit 时间单位;
  5. ThreadFactory 线程工厂;
  6. BlockingQueue任务队列(线程数大于线程池中线程的数量发布放入的队列);
  7. RejectedExecutionHandler 线程拒绝策略;(例如线程池中有两个线程,若这两个线程都被占用第3个线程来了能够设定拒绝策略拒绝这个线程)

2.1 newCachedThreadPool(实现定时任务)

package com.rrss.test.thread;

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

class Task extends Thread {

	public void run() {
		System.out.println("run");
	}
}

public class ThreadPoolDemo {

	public static void main(String[] args) {

		Task task = new Task();
		ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1);

		scheduled.scheduleWithFixedDelay(task, 3, 1, TimeUnit.SECONDS);// task在启动3s后,每隔1秒执行一次

	}
}
相关文章
相关标签/搜索