文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java如何固定大小的线程池

2024-04-02 19:55

关注

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);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯