2023-12-13 10:53

Java线程池

码自答

JavaEE

(329)

(0)

收藏

  • 线程池意义

    提高线程利用率

    降低线程创建和销毁的开销

    统一线程管理和监控

  • 线程池组成

    线程队列和任务队列

    线程队列:存放空闲线程

    任务队列:保存等待执行的任务

    线程取任务执行

  • 线程池的实现

    线程池通过ThreadPoolExecutor类实现

    ThreadPoolExecutor类的构造方法

    ThreadPoolExecutor(核心线程数,最大线程数,线程存活时间,时间单位,任务队列,拒绝策略)

    核心线程数----corePoolSize--------线程池中间活动线程数量

    最大线程数----maxinumPoolSize--线程中间最大线程数量

    任务队列------workQueue---------等待执行的任务。

    线程存活时间-keepAliveTime------线程池中间多余核心线程数量的线程存活时间

    线程工厂------threadFactory-------创建新线程

    拒绝策略------rejectedExecutionHandler-任务队列满是,新任务的处理策略

                 策略1-AbortPolicy--抛出异常

                 策略2-CallerRunsPolicy-任务交由调用线程池的线程执行

                 策略3-DiscardOldestPolicy-等待时间最长的任务丢弃

                 策略4-DiscardPolicy-任务丢弃

  • 窗口售票,每个窗口一个线程,模拟5个窗口售票 代码如下:

    线程类:

  • package com.wanmait.demo;
    
    public class Saller implements Runnable {
    
    	private static final int total = 100;
    	//总票数
    	
    	private static int num = 0;
    	
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		while(num<total)
    		{
    			synchronized(Saller.class) 
    			{
    				if(num < total)
    				{
    					num++;
    					System.out.println("卖"+num);
    				}
    			}
    		}
    	}
    
    }


    线程池类:

package com.wanmait.demo;

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

public class Test {

	public static void main(String[] args) {
		
		// TODO Auto-generated method stub
		ExecutorService executor = Executors.newFixedThreadPool(5);
		//创建固定大小的线程池
		
		for (int i = 0; i < 5; i++) {
			executor.execute(new Saller());//提交任务
			//new Saller()创建任务  从线程池中选线程执行任务
		}
		
		executor.shutdown();
		//关闭线程池
	}

}


0条评论

点击登录参与评论