☀️Terry

- - 草木逢春,雨过天晴🌈。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ThreadPoolExecutor配置

一、ThreadPoolExcutor为一些Executor提供了基本的实现,这些Executor是由Executors中的工厂 newCahceThreadPool、newFixedThreadPool和newScheduledThreadExecutor返回的。 ThreadPoolExecutor是一个灵活的健壮的池实现,允许各种各样的用户定制。

二、线程的创建与销毁

1、核心池大小、最大池大小和存活时间共同管理着线程的创建与销毁。

2、核心池的大小是目标的大小;线程池的实现试图维护池的大小;即使没有任务执行,池的大小也等于核心池的大小,并直到工作队列充满前,池都不会创建更多的线程。如果当前池的大小超过了核心池的大小,线程池就会终止它。

3、最大池的大小是可同时活动的线程数的上限。

4、如果一个线程已经闲置的时间超过了存活时间,它将成为一个被回收的候选者。

5、newFixedThreadPool工厂为请求的池设置了核心池的大小和最大池的大小,而且池永远不会超时

6、newCacheThreadPool工厂将最大池的大小设置为Integer.MAX_VALUE,核心池的大小设置为0,超时设置为一分钟。这样创建了无限扩大的线程池,会在需求量减少的情况下减少线程数量。

三、管理

1、 ThreadPoolExecutor允许你提供一个BlockingQueue来持有等待执行的任务。任务排队有3种基本方法:无限队列、有限队列和同步移交。

2、 newFixedThreadPool和newSingleThreadExectuor默认使用的是一个无限的 LinkedBlockingQueue。如果所有的工作者线程都处于忙碌状态,任务会在队列中等候。如果任务持续快速到达,超过了它们被执行的速度,队列也会无限制地增加。稳妥的策略是使用有限队列,比如ArrayBlockingQueue或有限的LinkedBlockingQueue以及 PriorityBlockingQueue。

3、对于庞大或无限的池,可以使用SynchronousQueue,完全绕开队列,直接将任务由生产者交给工作者线程

4、可以使用PriorityBlockingQueue通过优先级安排任务

ok

废话不多少说,直接开始:

public class ThreadFactory {

    static class ThreadPoolTask implements Runnable, Serializable {
        private Object attachData;

        ThreadPoolTask(Object o){
            this.attachData = o;
        }
        @Override
        public void run() {
            System.out.println("开始任务:"+attachData);
        }
    }
    public static final ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(
            10,
            30,
            2000,
            TimeUnit.MILLISECONDS,
            new ArrayBlockingQueue<Runnable>(100));

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i <10 ; i++) {
            String s = "task@"+i;
            System.out.println("创建任务并提交到线程池中:" + s);
            EXECUTOR.execute(new ThreadPoolTask(s));
            Thread.sleep(1000);
        }

    }
}

  

 

实例:

1:线程工厂

public class ThreadFactory {
    
    public static  ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(
            10,
            30,
            2000,
            TimeUnit.MILLISECONDS,
            new ArrayBlockingQueue<Runnable>(100));
    
}

2:创建任务

public class ThreadPoolTask implements  Runnable, Serializable {

    private Object o ;

    private BaseContext baseContext;

    public ThreadPoolTask(BaseEntity baseEntity,BaseContext baseContext){
        this.o=baseEntity;
        this.baseContext = baseContext;
    }

    @Override
    public void run() {
        System.out.println("线程开始:"+o.toString());
        baseContext.add((BaseEntity) o);
    }
}

3:模拟数据库实体

@Component
public class BaseContext {
    private static final Logger LOGGER = LoggerFactory.getLogger(BaseContext.class);

    public List<BaseEntity> baseEntities = Collections.synchronizedList(new ArrayList<BaseEntity>());

    public boolean add(BaseEntity baseEntity){
        LOGGER.info("===============新增===============");
        return baseEntities.add(baseEntity);
    }

    public BaseEntity query(String name){
        for (BaseEntity baseEntity : baseEntities) {
            if (baseEntity.getName().equals(name)){
                LOGGER.info("查询到的实体:"+baseEntity.toString());
                return baseEntity;
            }
            break;
        }
        return null;
    }
    public List<BaseEntity> queryList(){
       return baseEntities;
    }
}

4:实体

public class BaseEntity {
    private String name;
    private String age;

    public BaseEntity() {
    }

    public BaseEntity(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "BaseEntity{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

5:测试类

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {XXXXX.class})
public class DemoApplicationTests {

    @Autowired
    private BaseContext baseContext;
    @Test
    public void contextLoads() {

        for (int i = 0; i <10 ; i++) {
            ThreadFactory.EXECUTOR.execute(new ThreadPoolTask(new BaseEntity(" "+i,"2"),baseContext));
        }
        baseContext.baseEntities.forEach(s->{
            System.out.println(s.toString());
        });
    }

}

6:输出

posted on 2020-01-03 17:50  ☀️Terry  阅读(256)  评论(0编辑  收藏  举报