java中的线程池有哪些,分别有什么作用?

java中的线程池有哪些,分别有什么作用?

1.进程-线程简单介绍
2.java的线程池是什么,有哪些类型,作用分别是什么
3.使用线程池的优点

1.进程-线程的简单介绍
进程

什么是进程呢?

进程是计算机中的程序关于某数据集合的一次运行活动,是系统进行资源分配的调度的基本单位,是操作系统结构的基础。简单来讲:进程是指运行中的应用程序,进程是一个实体,每一个进程都有它自己的地址空间。例如我们点击了QQ,就启动了一个进程,操作系统就会为这个进程分配独立的地址空间,当我们又点击浏览器,这样又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。

线程

什么是线程呢?

线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。一个进程至少有一个线程。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。注意:线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属于一个进程的其他线程共享进程所拥有的全部资源,线程有就绪,阻塞,运行三种基本状态。

另外:在Unix System和SunOS中也被称为轻量进程,但轻量进程更多指内核线程,而把用户线程称为线程。

2.java的线程池是什么,有哪些类型,作用分别是什么?
线程池是一种多线程处理形式,处理过程中将任务添加队列,然后在创建线程后自动启动这些任务,每个线程都使用默认的堆栈大小,以默认的优先级运行,并处在多线程单元中,如果某个线程在托管代码中空闲,则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后辅助线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才能启动。

java里面的线程池的顶级接口是Executor,Executor并不是一个线程池,而只是一个执行线程的工具,而真正的线程池是ExecutorService。

java中的有哪些线程池?

1.newCachedThreadPool创建一个可缓存线程池程
2.newFixedThreadPool 创建一个定长线程池
3.newScheduledThreadPool 创建一个周期性执行任务的线程池
4.newSingleThreadExecutor 创建一个单线程化的线程池

下面一一分析:

1.newCachedThreadPool是一种线程数量不定的线程池,并且其最大线程数为Integer.MAX_VALUE,这个数是很大的,一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。但是线程池中的空闲线程都有超时限制,这个超时时长是60秒,超过60秒闲置线程就会被回收。调用execute将重用以前构造的线程(如果线程可用)。这类线程池比较适合执行大量的耗时较少的任务,当整个线程池都处于闲置状态时,线程池中的线程都会超时被停止。

实例代码:

public class PoolExecutorTest {public static void main(String[] args) {// TODO Auto-generated method stubExecutorService mCachelThreadPool = Executors.newCachedThreadPool();for(int i = 0;i < 7;i++ ) {final int index = i;try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}mCachelThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println("第" +index +"个线程" +Thread.currentThread().getName()); }});}}}

输出结果:
在这里插入图片描述
从结果可以看到,执行第二个任务的时候第一个任务已经完成,会复用执行第一个任务的线程,不用每次新建线程。

2.newFixedThreadPool 创建一个指定工作线程数量的线程池,每当提交一个任务就创建一个工作线程,当线程 处于空闲状态时,它们并不会被回收,除非线程池被关闭了,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列(没有大小限制)中。由于newFixedThreadPool只有核心线程并且这些核心线程不会被回收,这样它更加快速底相应外界的请求。

实例代码:

public class PoolExecutorTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stub//设置最大线程数5个ExecutorService mFixedThreadPool = Executors.newFixedThreadPool(5);for(int i = 0;i < 7;i++ ) {final int index = i;mFixedThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println("时间是:"+System.currentTimeMillis()+"第" +index +"个线程" +Thread.currentThread().getName()); try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}	}});}}}

输出结果:
在这里插入图片描述
由于设置最大线程是5,所以当执行完这5个线程后,等待两秒后,在执行后面2个线程。

3.newScheduledThreadPool 创建一个线程池,它的核心线程数量是固定的,而非核心线程数是没有限制的,并且当非核心线程闲置时会被立即回收,它可安排给定延迟后运行命令或者定期地执行。这类线程池主要用于执行定时任务和具有固定周期的重复任务。

延迟执行实例代码:

public class PoolExecutorTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stub//设置池中核心数量是2ScheduledExecutorService mScheduledThreadPool = Executors.newScheduledThreadPool(2);  System.out.println("现在的时间:"+System.currentTimeMillis());mScheduledThreadPool.schedule(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("现在的时间:"+System.currentTimeMillis());}}, 4, TimeUnit.SECONDS);//这里设置延迟4秒执行}}

执行的结果如下:
在这里插入图片描述
误差可以忽略,实际结果确实延迟了4秒执行。

定期执行示例代码

public class PoolExecutorTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stub//设置池中核心数量是2ScheduledExecutorService mScheduledThreadPool = Executors.newScheduledThreadPool(2);  System.out.println("现在的时间:"+System.currentTimeMillis());mScheduledThreadPool.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("现在的时间:"+System.currentTimeMillis());}}, 2, 3,TimeUnit.SECONDS);//这里设置延迟2秒后每3秒执行一次}}

执行的结果如下:
在这里插入图片描述
可发现确实延迟2秒后每隔3秒后就会执行一次,程序不退出就一直执行下去。

4.newSingleThreadExecutor这类线程池内部只有一个核心线程,以无界队列方式来执行该线程,这使得这些任务之间不需要处理线程同步的问题,它确保所有的任务都在同一个线程中按顺序中执行,并且可以在任意给定的时间不会有多个线程是活动的。

示例代码:

public class PoolExecutorTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stubExecutorService mSingleThreadPool = Executors.newSingleThreadExecutor();     for(int i = 0;i < 7;i++) {final int number = i;mSingleThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println("现在的时间:"+System.currentTimeMillis()+"第"+number+"个线程");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}});}}}

执行的结果如下:
在这里插入图片描述
可发现是有顺序地去执行上面6个线程。

3.使用线程池的优点

1.重用线程池的线程,避免因为线程的创建和销毁锁带来的性能开销

2.有效控制线程池的最大并发数,避免大量的线程之间因抢占系统资源而阻塞

3.能够对线程进行简单的管理,并提供一下特定的操作如:可以提供定时、定期、单线程、并发数控制等功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二进制编译安装mysql_二进制编译安装mysql

1:解压包及做链接# tar xvf mysql-5.5.13-linux2.6-i686.tar.gz -C /usr/local# cd /usr/local# ln -sv mysql-5.5.13-linux2.6-i686 mysql# cd mysql---------------------------------------------------------------2:增加用户mysql及创建数据库数据存放目录/mydata/data# g…

线程安全的集合类有哪些?

验证ArrayList线程不安全 ArrayList 应当是开发中用到的最多的集合类&#xff0c;是动态列表&#xff0c;List 接口的实现类。 多数情况下&#xff0c;我们实在单线程环境使用&#xff0c;或者是在方法内部&#xff0c;以局部变量的形式使用&#xff0c;一般不会出现线程安全问…

try-catch-finally的执行顺序

try-catch-finally的执行顺序 结论&#xff1a; 不管有没有出现异常&#xff0c;finally代码块都会执行&#xff1b;不管try和catch的代码块中有return时&#xff0c;finally仍会执行&#xff0c;且如果finally代码块也有return&#xff0c;则此代码肯定会返回finally执行的r…

java jdbc mysql url_java – 如何生成JDBC数据库URL?

我今天已经研究了大约3个小时,我觉得我很接近,但我有几个问题.我到目前为止找到的最好的信息来源是&#xff1a;https://stackoverflow.com/a/2840358,但它没有回答我的所有问题.一点背景&#xff1a;我正在使用Microsoft SQL Server 2014,并且我已经验证了IP地址127.0.0.1处于…

try catch finally 中包含return的几种情况,及返回结果

第一种情况&#xff1a;在try和catch中有return&#xff0c;finally中没有return&#xff0c;且finally中没有对try或catch中要 return数据进行操作的代码&#xff0c;这种情况也是最好理解的。 public class Test {public static int num1;public static void main(String[] …

java jp2launcher.exe_芯科cp2112有熟悉的吗?配置不能保存是什么原因?

文件夹PATH列表卷序列号为2474-602AC:.├─CP2112_SDK│ │ ReleaseNotes.txt│ ││ ├─Documentation│ │ ├─ApplicationNotes│ │ │ an495.pdf│ │ │ an496.pdf│ │ ││ │ ├─Datasheets│ │ │ CP2112.pdf│ │ ││ │ ├─Datash…

包装类的缓存问题

包装类的缓存问题 整型、char类型所对应的包装类&#xff0c;在自动装箱时&#xff0c;对于-128~127之间的值会进行缓存处理&#xff0c;其目的是提高效率。 缓存处理的原理为&#xff1a;如果数据在-128~127这个区间&#xff0c;那么在类加载时就已经为该区间的每个数值创建…

java中项目启动时加载_如何在项目启动时,加载或解析某配置文件

在web项目中有很多时候需要在项目启动时就执行一些方法&#xff0c;而且只需要执行一次&#xff0c;比如&#xff1a;加载解析自定义的配置文件、初始化数据库信息等等&#xff0c;在项目启动时就直接执行一些方法&#xff0c;可以减少很多繁琐的操作。在工作中遇到了项目初始数…

Shiro介绍及主要流程

Shiro介绍及主要流程 什么是Shiro Apache Shiro是一个强大且灵活的开源安全框架&#xff0c;易于使用且好理解&#xff0c;撇开了搭建安全框架时的复杂性。 Shiro可以帮助我们做以下几件事&#xff1a; 认证使用者的身份 提供用户的访问控制&#xff0c;比如&#xff1a; 决定…

java数据库程序实例_Java连接各种数据库的实例大全

1、Oracle8/8i/9i数据库(thin模式)Class.forName(“oracle.jdbc.driver.OracleDriver”)。newInstance()&#xff1b;String url“jdbc:oracle:thin:localhost:1521:orcl”;//orcl为数据库的SIDString user“test”;String password“test”;Connection conn DriverManager.get…

http的请求体body的几种数据格式

文章目录multipart/form-dataapplication/x-www-from-urlencodedrawbinarypostman中 Params和Body的区别multipart/form-data 以表单形式提交&#xff0c;主要是上传文件用它&#xff0c;在http中格式为 application/x-www-from-urlencoded 以键值对的数据格式提交 raw…

谷歌浏览器安装json格式化插件

谷歌浏览器安装json格式化插件 实际开发工作中经常用到json数据&#xff0c;那么就会有这样一个需求&#xff1a;在谷歌浏览器中访问URL地址返回的json数据能否按照json格式展现出来。 比如&#xff0c;在谷歌浏览器中访问&#xff1a;http://jsonview.com/example.json 展现…

java 俄罗斯方块窗口_[代码全屏查看]-java 俄罗斯方块

[1].[代码] [Java]代码package com;import java.awt.Color;import java.awt.Graphics;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Random;import javax.swing.JFrame;import javax.swing.JPanel;public class Eluos extends JFrame{p…

vue3.0中使用Element-plus默认英文组件修改为中文

vue3.0中使用Element-plus默认英文组件修改为中文修改方法 说明&#xff1a;本方法Element-plus 1.0.2-beta.59 之前的版本可以&#xff0c;1.0.2-beta.59之后版本请看下一篇博客 1,引入element // ! element-plus vue3.0 import element from element-plus import element-…

在java中null的作用_在java中避免使用!= null有什么好处?

使用空集合或“空白”操作而不是null的主要优点是,大多数情况下,此类对象仍然可以在代码中工作而无需进一步修改.从本质上来说,空值更容易出错.请使用以下代码,例如&#xff1a;String[] names data.getNames();if (names ! null) {for (String name : names) {// Do stuff}}需…

新版Elemen Plus 国际化 1.0.2-beta.59(包含59)

根据官方文档可以找到解决办法。先来看一下官方文档内容 官方给出了两种方式。这里只研究第一种方式&#xff1a; <template><el-config-provider :locale"locale"><App /></el-config-provider> </template><script> import …

java开发亚马逊mws_GitHub - iotwlw/Amazon-MWS-SDK: 基于亚马逊MWS Java SDK 的封装

amazon-mws-java-sdk亚马逊MWS服务的Java-SDK封装安装在pom.xml中添加依赖top.guyi.amazonAmazon-MWS-SDK1.0.0.1依赖放在nexus私服中&#xff0c;并没有上传到中央仓库&#xff0c;所以请在pom.xml中加入仓库配置guyi-maple-nexushttp://nexus.guyi-maple.space/nexus/content…

oracle数据库中索引会失效的几种情况

创建Oracle 索引的目的是为了避免全表扫描数据&#xff0c;提高查询效率&#xff0c;但是如果sql语句写的不好致使索引失效&#xff0c;反而会影响数据查询效率。以下几种情况就会导致索引失效&#xff1a; 1. 没有 WHERE 子句 众所周知&#xff0c;添加索引的字段必需要在whe…

JAVA跑步计时器app_坚持跑步神器app

&#xfeff;坚持跑步神器app&#xff0c;让坚持不了自己跑步训练的人能够完成自己的训练目标&#xff0c;特色的惩罚系统时刻监督你跑步&#xff0c;不需要GPS就可以实现&#xff0c;非常方便&#xff0c;快来下载吧坚持跑步神器app介绍坚持跑步神器&#xff0c;设定每天跑步多…

java 中 BigDecimal 详解

首先&#xff0c;学习一个东西&#xff0c;我们都必须要带着问题去学&#xff0c;这边我分为 【为什么&#xff1f;】【是什么&#xff1f;】【怎么用&#xff1f;】 【为什么要用BigDecimal&#xff1f;】 首先&#xff0c;我们先看一下&#xff0c;下面这个现象 那为什么会…