转自:http://blog.csdn.net/coding_or_coded/article/details/6856014
Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要。
有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类,熟悉这部分API特征是一项艰难的学习过程。目前有关这方面的资料和书籍都少之又少,大所属介绍线程方面书籍还停留在java5之前的知识层面上。
当然新特征对做多线程程序没有必须的关系,在java5之前通用可以写出很优秀的多线程程序。只是代价不一样而已。
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。
在Java5之前,要实现一个线程池是相当有难度的,现在Java5为我们做好了一切,我们只需要按照提供的API来使用,即可享受线程池带来的极大便利。
Java5的线程池分好多种:具体的可以分为两类,固定尺寸的线程池、可变尺寸连接池。
在使用线程池之前,必须知道如何去创建一个线程池,在Java5中,需要了解的是java.util.concurrent.Executors类的API,这个类提供大量创建连接池的静态方法,是必须掌握的。
一、固定大小的线程池,newFixedThreadPool:
-
packageapp.executors;
-
-
importjava.util.concurrent.Executors;
-
importjava.util.concurrent.ExecutorService;
-
-
-
-
-
-
-
publicclassTest{
-
publicstaticvoidmain(String[]args){
-
-
ExecutorServicepool=Executors.newFixedThreadPool(5);
-
-
Threadt1=newMyThread();
-
Threadt2=newMyThread();
-
Threadt3=newMyThread();
-
Threadt4=newMyThread();
-
Threadt5=newMyThread();
-
-
pool.execute(t1);
-
pool.execute(t2);
-
pool.execute(t3);
-
pool.execute(t4);
-
pool.execute(t5);
-
-
pool.shutdown();
-
}
-
}
-
-
classMyThreadextendsThread{
-
@Override
-
publicvoidrun(){
-
System.out.println(Thread.currentThread().getName()+"正在执行。。。");
-
}
-
}
输出结果:
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-3正在执行。。。
-
pool-1-thread-4正在执行。。。
-
pool-1-thread-2正在执行。。。
-
pool-1-thread-5正在执行。。。
改变ExecutorService pool = Executors.newFixedThreadPool(5)中的参数:ExecutorService pool = Executors.newFixedThreadPool(2),输出结果是:
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-2正在执行。。。
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-2正在执行。。。
从以上结果可以看出,newFixedThreadPool的参数指定了可以运行的线程的最大数目,超过这个数目的线程加进去以后,不会运行。其次,加入线程池的线程属于托管状态,线程的运行不受加入顺序的影响。
二、单任务线程池,newSingleThreadExecutor:
仅仅是把上述代码中的ExecutorService pool = Executors.newFixedThreadPool(2)改为ExecutorService pool = Executors.newSingleThreadExecutor();
输出结果:
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-1正在执行。。。
可以看出,每次调用execute方法,其实最后都是调用了thread-1的run方法。
三、可变尺寸的线程池,newCachedThreadPool:
与上面的类似,只是改动下pool的创建方式:ExecutorService pool = Executors.newCachedThreadPool();
输出:
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-2正在执行。。。
-
pool-1-thread-4正在执行。。。
-
pool-1-thread-3正在执行。。。
-
pool-1-thread-5正在执行。。。
这种方式的特点是:可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。
四、延迟连接池,newScheduledThreadPool:
-
packageapp.executors;
-
-
importjava.util.concurrent.Executors;
-
importjava.util.concurrent.ScheduledExecutorService;
-
importjava.util.concurrent.TimeUnit;
-
-
-
-
-
-
-
publicclassTest{
-
publicstaticvoidmain(String[]args){
-
-
ScheduledExecutorServicepool=Executors.newScheduledThreadPool(2);
-
-
Threadt1=newMyThread();
-
Threadt2=newMyThread();
-
Threadt3=newMyThread();
-
-
pool.execute(t1);
-
-
pool.schedule(t2,1000,TimeUnit.MILLISECONDS);
-
pool.schedule(t3,10,TimeUnit.MILLISECONDS);
-
-
-
pool.shutdown();
-
}
-
}
-
-
classMyThreadextendsThread{
-
@Override
-
publicvoidrun(){
-
System.out.println(Thread.currentThread().getName()+"正在执行。。。");
-
}
-
}
读者可以尝试改变Executors.newScheduledThreadPool(2)的参数来得到更多的体验,当然,让
-
@Override
-
publicvoidrun(){
-
System.out.println(Thread.currentThread().getName()+"正在执行。。。");
-
}
变成一个无限循环,你可以得到更多的关于pool.shutdown()的用法。
五:单任务延迟连接池(和上面类似,就不写了)。当然我们也可以自定义线程池,这里就不写了,累啊……
shutdown() 方法不会阻塞。调用 shutdown() 方法之后,主线程就马上结束了,而线程池会继续运行直到所有任务执行完才会停止。如果不调用
shutdown() 方法,那么线程池会一直保持下去,以便随时添加新的任务。
分享到:
相关推荐
ruoyi-vue-pro-vben 芋道管理后台,基于 vben 最新版本,最新的 vue3 vite4 ant-design-vue 4.0 typescript 语法进行重构开发,支持 springboot3 springcloud 版本
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值
该项目是一个基于Java语言开发的水果管理系统设计源码,包含53个文件,其中包括30个Java源文件、13个XML配置文件、6个JAR包文件、1个Git忽略文件、1个属性文件以及1个SQL脚本文件。此系统旨在用于期末答辩展示,展示了开发者对Java编程和系统设计的深入理解。
java回顾、知识整理、拾遗、面试_java-review
mysql主从复制用struts2,spring,hibernate框架,搭建在线考试系统。网站支持(1)老师创建题库,创建题目,查看题目对题目进行增删改,发布考试(选择考试难中易比例),批改学生试卷,查看学生成绩。(.zip
一个基于Go语言实现的搜索引擎项目资源
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
基于grpc开发的跨语言的交互系统,集成BCS,Brower
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
基于go语言,使用gocv和socket实现摄像头视频传输项
apache-seatunnel-web-1.0.2
内容概要:本篇文章主要介绍了如何在VMware虚拟化平台上搭建并配置QNX Neutrino实时操作系统的步骤方法。文章首先给出了获取必要的安装文件来源,然后逐步指导用户如何完成QNX在虚拟机中的安装过程以及相关网络参数配置,包括选择适当的网络模式来实现宿主机器与QNX虚拟机之间的通信,具体为设置NAT模式或者桥接模式下的网络参数,如指定静态或动态获取IP地址的方法。 适用人群:对嵌入式开发感兴趣的技术人士,尤其是需要在Linux环境下开展工作的程序员和系统工程师。 使用场景及目标:通过详细的操作指南帮助初学者快速掌握在Windows或Linux主机上利用虚拟机搭建QNX Real-Time Operating System开发环境的基础技能,能够实现在该环境中运行简单的C/C++应用程序。 其他说明:本文不仅适用于QNX初学者作为入门引导资料,也为经验丰富的开发者提供了有关于特定环境配置的重要参考。由于涉及到的具体细节比较多,读者最好边操作边对照文章内容进行练习。同时要注意保持最新版本的虚拟化平台客户端和服务端程序以确保兼容性和稳定性。
stm32中dma结合ad的使用
yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值
低全球变暖潜能值 (GWP) 制冷剂.docx
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
ubuntu