java多线程——线程池

为什么要使用线程池?

(1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

(2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。

(3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

创建和使用线程池:

在java中我们可以使用new ThreadPoolExecutor(...) 来创建线程池

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }
    
corePoolSize - 池中所保存的线程数,包括空闲线程。
maximumPoolSize - 池中允许的最大线程数。
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
unit - keepAliveTime 参数的时间单位。
workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。

一般情况下我们不用自定义线程池,java中提供了大量创建连接池的静态方法,接下来我们来介绍常用的几种:

首先看一下线程池的类图结构:

java多线程——线程池_第1张图片

(1)固定大小的线程池 

ExecutorService pool = Executors.newFixedThreadPool(10)

(2)单线程化的线程池

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor()

(3)可缓存线程池

ExecutorService cachedThreadPool = Executors.newCachedThreadPool

(4)一个定长线程池,支持定时及周期性任务执行

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

简单实用线程池例子:

public class ThreadPoolTest {
    public static void main(String[] args) {
        
        // 固定大小线程池
        ExecutorService pool = Executors.newFixedThreadPool(2);
        //创建5个线程
        Thread t1 = new MyThread();
        Thread t2 = new MyThread();
        Thread t3 = new MyThread();
        Thread t4 = new MyThread();
        Thread t5 = new MyThread();
        
        //将线程放入线程池
        pool.execute(t1);
        pool.execute(t2);
        pool.execute(t3);
        pool.execute(t4);
        pool.execute(t5);
        
        //关闭线程池
        pool.shutdown();
    }
}

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "正在执行。。。");
    }
}

//执行结果
pool-1-thread-1正在执行。。。
pool-1-thread-2正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-2正在执行。。。
pool-1-thread-1正在执行。。。


你可能感兴趣的:(java多线程——线程池)