Java如何固定大小的线程池

作者:蛋黄酥要不要来一口 时间:2021-08-30 06:18:19 

1.固定大小的线程池简介

线程池就是在程序启动的时候先建立几个可以使用的线程放在那里,然后等着具体的任务放进去,这个任务基本可以说都是Runnable的实现类,因此它减小了系统每次新建和销毁线程的开销,但同时增加了维护这些线程的开销,个中取舍看具体情况而定。

固定大小的线程池就是在启动的时候创建了固定个数的线程放在那里等待使用。

2.包装一个线程池对象


public class TaskPool{
   private final ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newFixedThreadPool(9); // 创建一个大小为9的固定线程池,可以按照CPU的核数初步判定,如果CPU密集性任务则创建N+1个,如果是IO密集型任务则创建2N+1个,其中N即CPU的核数
   protected void shutdown(){
       // do something
       // 这个方法等待线程池中所有已提交任务执行结束,不接收新任务,然后结束
       executor.shutdown();
       // 这个强制结束所有任务,然后正在等在的任务列表
       // executor.shutdownNow();
   }
   protected void execute(Runnable command){
       // do something
       // 提交任务
       executor.execute(command);
   }
   public void status(){
       StringBuffer sb = new StringBuffer();
       // 当前正在执行任务的线程数
       sb.append(executor.getActiveCount() + "\n");
       // 当前正在等待执行的线程数
       sb.append(executor.getQueue().size() + "\n");
       // 返回已经完成的线程数
       sb.append(executor.getCompletedTaskCount() + "\n");
       System.out.println(sb.toString());
       // 注:以上方法都是返回一个大概值,因为线程在执行中,这些状态随时都会改变
   }
}      

3.使用线程池


public class Launcher{
   private TaskPool taskPool = new TaskPool();
   public static void main(String[] args){
       // 新建100个任务,Runnable的实现类Task
       Task[] tasks = new Task[100];
       for (int i = 0; i < tasks.length; i++){
           tasks[i] = new Task("Task " + (i+1));
           // 提交到线程池运行
           taskPool.execute(task[i]);
           if ( i % 50 == 0){
               taskPool.status();
       }
   }
   private static class Task implements Runnable{
       private String name;
       public Task(String name){
           this.name = name;
       }
       public void run(){
           // do something
           System.out.println("我的名字是:" + this.name);
       }
   }
}

Java线程池小拓展

线程池的介绍

1 常用的 池化技术

C3P0

DBCP

2 线程池的衍生

频繁的创建线程对象和多线程之间进行上下文切换,是非常耗时间和资源的所以JDK1.5中提出了线程池技术

3 使用线程池

Exector

4 线程池的创建

创建一个固定大小的线程池 ( 最常用的方法 )


ExecutorService pool = Executors.newFixedThreadPool(2);
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);//线程池的带下只有两个 现在这个任务在其等待队列中排队等候

创建可变大小的线程池


ExecutorService pool = Executors.newCachedThreadPool();
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);

创建独立任务的线程池


ExecutorService pool = Executors.newSingleThreadExecutor();
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
pool.execute(task);
pool.execute(task);
pool.execute(task);

创建可调度的线程池


ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(2);
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
threadPool.schedule(task, 2000, TimeUnit.MILLISECONDS);

来源:https://blog.csdn.net/zoubaicai/article/details/81122022

标签:Java,线程池
0
投稿

猜你喜欢

  • Java使用JDBC或MyBatis框架向Oracle中插入XMLType数据

    2023-10-21 04:12:22
  • 关于java.util.Random的实现原理详解

    2023-05-18 14:52:08
  • 详解Java中JSON数据的生成与解析

    2022-02-21 22:54:44
  • Android实现掷骰子效果

    2022-06-16 01:09:16
  • java Timer测试定时调用及固定时间执行代码示例

    2023-12-09 14:36:44
  • SpringMVC 向jsp页面传递数据库读取到的值方法

    2022-03-29 00:51:15
  • C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(上)

    2022-11-02 06:21:42
  • Maven的几个常用plugin

    2021-12-05 13:36:28
  • 从try-with-resources到ThreadLocal,优化你的代码编写方式

    2023-11-11 03:19:52
  • Java加载property文件配置过程解析

    2023-10-07 07:53:03
  • java操作mongodb之多表联查的实现($lookup)

    2023-08-08 10:24:07
  • SpringBoot整合Shiro的方法详解

    2022-04-13 15:05:56
  • C#实现左截取和右截取字符串实例

    2022-06-06 08:29:39
  • Java 逻辑控制详解分析

    2023-08-13 20:08:11
  • Java图片裁剪和生成缩略图的实例方法

    2023-11-09 00:01:50
  • Java命名规则详细总结

    2023-11-14 12:20:55
  • C#影院售票系统毕业设计(3)

    2023-04-24 04:08:57
  • SpringBoot Redis用注释实现接口限流详解

    2022-03-15 17:40:55
  • Java多线程实现简易微信发红包的方法实例

    2023-04-16 11:46:15
  • C#多线程之线程池ThreadPool用法

    2021-07-21 06:28:40
  • asp之家 软件编程 m.aspxhome.com