线程池

  • 1.什么是线程池
  • 2.线程池的好处
  • 3.线程池的应用场合
  • 4.使用线程池执行大量的 Runnable 命令
  • 5.使用线程池执行大量的 Callable 任务


1.什么是线程池

创建和销毁对象是非常耗费时间的
创建对象: 需要分配内存等资源
销毁对象: 虽然不需要程序员操心,但是垃圾回收器会在后台一直跟踪并销毁
对于经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大
思路: 创建好多个线程,放入线程池中,使用时直接获取引用,不使用时放回池中。可以避免频繁创建销毁、实现重复利用
生活案例: 共享单车
技术案例: 线程池、数据库连接池
JDK1.5 起,提供了内置线程池

2.线程池的好处

  • 提高响应速度(减少了创建新线程的时间)
  • 降低资源消耗(重复利用线程池中线程,不需要每次都创建)
  • 提高线程的可管理性:避免线程无限制创建、从而销毁系统资源,降低系统稳定性,甚至内存溢出或者 CPU 耗尽

3.线程池的应用场合

  • 需要大量线程,并且完成任务的时间短
  • 对性能要求苛刻
  • 接受突发性的大量请求

4.使用线程池执行大量的 Runnable 命令

测试代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Text{
    public static void main(String[] args) {
        //如何创建一个线程池
        //创建一个线程池,线程池中只有一个线程对象
        //ExecutorService pool1=Executors.newSingleThreadExecutor();
        //创建一个线程池,线程池中有线程的数量固定
        //ExecutorService pool1=Executors.newFixedThreadPool(10);
        //创建一个线程池,线程池中的线程的数量可以动态的改变
        ExecutorService pool1= Executors.newCachedThreadPool();
        /**使用线程池执行大量的Runnable命令*/
        for(int i=0;i<20;i++){
            final int n=i;
            //使用匿名内部类//任务
            Runnable command=new Runnable() {
                @Override
                public void run() {
                    System.out.println("开始执行:"+n);
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("执行结束:"+n);
                }
            };//任务结束
            //将任务交给线程池中的线程去执行
            pool1.execute(command);
        }
        //关闭线程池
        pool1.shutdown();
    }
}

运行结果:

java多线程变量共享 线程池 java多线程并发编程 线程池_并发编程

5.使用线程池执行大量的 Callable 任务

测试代码:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class Text{
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 如何创建一个线程池
        //创建一个线程池,线程池中只有一个线程对象
        //ExecutorService pool1=Executors.newSingleThreadExecutor();
        //创建一个线程池,线程池中有线程的数量固定
        ExecutorService pool1=Executors.newFixedThreadPool(10);
        //创建一个线程池,线程池中的线程的数量可以动态的改变
        //ExecutorService pool1 = Executors.newCachedThreadPool();
        //创建一个集合
        List<Future> list=new ArrayList<Future>();
        /**使用线程池执行大量的Callable任务*/
        for(int i=0;i<20;i++){
            //使用匿名内部类
            //创建任务
            Callable<Integer> task=new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    Thread.sleep(2000);
                    return (int)(Math.random()*10)+1;
                }
            }; //任务结束
            //将任务交能线程池
            Future f=pool1.submit(task);
            list.add(f);
        }
        System.out.println("ok?");
        //遍历集合
        for(Future ff:list){
            System.out.println(ff.get());
        }
        System.out.println("OK!");
        //关闭线程池
        pool1.shutdown();
    }
}

运行结果:

java多线程变量共享 线程池 java多线程并发编程 线程池_java多线程变量共享 线程池_02