如何创建一个线程池

如何创建一个线程池

线程池主要使用ThreadPoolExecutorScheduledThreadPoolExcutor来创建

ThreadPoolExecutor

ThreadPoolExecutor一共有四个构造方法

image-20250128161612108

参数介绍

参数描述
corePoolSize核心线程数
maximumPoolSize最大线程数
keepAliveTime线程存活时间
unit时间单位
workQueue工作队列
threadFactory线程工厂
handler任务拒绝策略

参数含义

corePoolSizemaximumPoolSizekeepAliveTimeunit
3510TimeUnit.SECOUNDS

image-20250128171029111

非核心线程没有任务并且达到存活时间就会被销毁

核心线程:线程池不关闭就不会被销毁

工作队列workQueue

没执行的任务都是在这里排队,线程池的线程会从这里去拿任务

线程工厂ThreadFactory

线程工厂可以执行线程如何生产线程,设置自定义线程名称,线程优先级,线程类型等

public class ThreadFActory implement THreadFactory{
    
    @Override
    Thread new THread(Runnable r){
        Thread t = new THread(r);
        t.setName("..");
        t.setPriority(Thread.NORM_PRIORITY);
        return t;
    }
    
}

任务拒绝策略handler

  • 情况一:核心线程数和非核心线程数已满
  • 情况二:线程池的线程都在忙碌
  • 情况三:任务队列已满
  • 情况四:线程池无法扩容

满足以上四种情况的时候,这个任务就会被拒绝

线程拒绝策略方式:

任务拒绝策略描述
AbortPolicy默认拒绝策略,抛出RejectedExecutionException异常
DiscardPolicy直接丢弃任务
DiscardOldestPolicy丢弃处于任务头部任务,添加被拒绝任务
CallerRunsPolicy使用调用者线程直接执行被拒绝任务

最后,使用原生线程创建线程池代码如下:

该代码会按顺序打印出1-100

package com.javaclimb.test;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Main {
    static final int n = 1;

    public static void main(String[] args) {
        MyNumber myNumber = new MyNumber();
        Task1 task1 = new Task1(myNumber);
        //创建线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 1,
                TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>(), new MyThreadFactory("task"));
        //10个任务提交给线程池
        for (int i = 1; i <= 10; i++) {
            threadPoolExecutor.execute(task1);
        }
        //关闭线程池
        threadPoolExecutor.shutdown();
    }
}

//线程工厂
class MyThreadFactory implements ThreadFactory {
    private int count = 1;
    private String prefix;

    public MyThreadFactory(String prefix) {
        this.prefix = prefix;
    }

    @Override
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        thread.setName(prefix + "-" + count++);
        thread.setPriority(Thread.NORM_PRIORITY);
        return thread;
    }
}

class MyNumber {
    public  Integer n = 1;
    public  Boolean f = false;
}

class Task implements Runnable {
    private final MyNumber myNumber;
    public Task(MyNumber myNumber) {
        this.myNumber = myNumber;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (myNumber) {
                if (myNumber.n == 100) {
                    if(!myNumber.f)System.out.println(Thread.currentThread().getName()+"->" + myNumber.n);
                    myNumber.f = true;
                    break;
                }
                System.out.println(Thread.currentThread().getName()+"->" + myNumber.n);
                myNumber.n++;
            }
        }
    }
}

执行结果也可以看到是没问题的

image-20250128183031778

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值