zoukankan      html  css  js  c++  java
  • 使用线程池创建线程

    例子:

    package com.example.demo.thread;
    
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    public class ThreadPoolExecutorTest {
        public static void main(String[] args) {
            ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,
                    new ArrayBlockingQueue<Runnable>(5));
    
            for (int i = 1; i < 16; i++) {
                MyTask myTask = new MyTask(i);
                executor.execute(myTask);
                System.out.println("线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" +
                        executor.getQueue().size() + ",已执行完别的任务数目:" + executor.getCompletedTaskCount());
            }
            executor.shutdown();
        }
    }
    
    class MyTask implements Runnable {
        private int taskNum;
    
        public MyTask(int num) {
            this.taskNum = num;
        }
    
        @Override
        public void run() {
            System.out.println("正在执行task " + taskNum);
            try {
                Thread.currentThread().sleep(4000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("task " + taskNum + "执行完毕");
        }
    }

    执行结果:


    正在执行task
    1
    线程池中线程数目:1,队列中等待执行的任务数目:0,已执行完别的任务数目:0
    线程池中线程数目:2,队列中等待执行的任务数目:0,已执行完别的任务数目:0
    正在执行task 2
    线程池中线程数目:3,队列中等待执行的任务数目:0,已执行完别的任务数目:0
    正在执行task 3
    线程池中线程数目:4,队列中等待执行的任务数目:0,已执行完别的任务数目:0
    正在执行task 4
    正在执行task 5
    线程池中线程数目:5,队列中等待执行的任务数目:0,已执行完别的任务数目:0
    线程池中线程数目:5,队列中等待执行的任务数目:1,已执行完别的任务数目:0
    线程池中线程数目:5,队列中等待执行的任务数目:2,已执行完别的任务数目:0
    线程池中线程数目:5,队列中等待执行的任务数目:3,已执行完别的任务数目:0
    线程池中线程数目:5,队列中等待执行的任务数目:4,已执行完别的任务数目:0
    线程池中线程数目:5,队列中等待执行的任务数目:5,已执行完别的任务数目:0
    线程池中线程数目:6,队列中等待执行的任务数目:5,已执行完别的任务数目:0
    正在执行task 11
    线程池中线程数目:7,队列中等待执行的任务数目:5,已执行完别的任务数目:0
    正在执行task 12
    线程池中线程数目:8,队列中等待执行的任务数目:5,已执行完别的任务数目:0
    正在执行task 13
    线程池中线程数目:9,队列中等待执行的任务数目:5,已执行完别的任务数目:0
    正在执行task 14
    正在执行task 15
    线程池中线程数目:10,队列中等待执行的任务数目:5,已执行完别的任务数目:0
    task 1执行完毕
    task 2执行完毕
    task 13执行完毕
    正在执行task 6
    task 5执行完毕
    task 12执行完毕
    正在执行task 8
    task 11执行完毕
    task 3执行完毕
    正在执行task 10
    task 4执行完毕
    正在执行task 9
    正在执行task 7
    task 15执行完毕
    task 14执行完毕
    task 6执行完毕
    task 10执行完毕
    task 9执行完毕
    task 7执行完毕
    task 8执行完毕
    
    Process finished with exit code 0

    模拟有15个任务, 首先会使用 5个线程来执行5个任务,之后5个任务会放入到队列(队列容量为5)当中,队列放满来之后,

    如果没有达到设置到最大线程数,就会继续使用线程(这里10-5=5) 5个。等线程中有执行完任务的线程,会把队列的任务取出来执行

  • 相关阅读:
    C#事件(event)解析
    dll加入到GAC后,如何方便的调试
    『C程序设计』读书笔记系列文章之第四章 逻辑运算和判断选取控制
    C#委托之个人理解
    虚方法(virtual)和抽象方法(abstract)的区别
    『C程序设计』读书笔记系列文章之第二章 数据类型、运算符与表达式
    SOA概览(转)
    今天学的几个有用的句型
    【老孙随笔】PPT高手的启示
    【项目经理之修炼(11)】《初级篇》什么样的项目经理才可能成功??
  • 原文地址:https://www.cnblogs.com/wanjun-top/p/12833883.html
Copyright © 2011-2022 走看看