JAVA之多线程

文章目录

    • 进程与线程
    • 多线程的生命周期
    • 多线程的实现方式

进程与线程

  1. 进程是指运行中的应用程序,每一个进程都有自己独立的内存空间;
  2. 线程是指进程中的一个执行流程,有时也称为执行情景;
  3. 一个进程可以由多个线程组成,即在一个进程中可以同时运行多个不同的线程,它们分别执行不同的任务;
  4. 当进程内的多个线程同时运行,这种运行方式称为并发运行;

多线程的生命周期

在这里插入图片描述

  1. 就绪状态:就绪状态的线程又叫做可运行状态,表示当前线程具有抢夺CPU时间片的权力(CPU时间片就是执行权)。当一个线程抢夺到CPU时间片之后,就开始执行run方法,run方法的开始执行标志着线程进入运行状态。

  2. 运行状态:run方法的开始执行标志着这个线程进入运行状态,当之前占有的CPU时间片用完之后,会重新回到就绪状态继续抢夺CPU时间片,当再次抢到CPU时间之后,会重新进入run方法接着上一次的代码继续往下执行。

  3. 阻塞状态:当一个线程遇到阻塞事件,例如接收用户键盘输入,或者sleep方法等,此时线程会进入阻塞状态,阻塞状态的线程会放弃之前占有的CPU时间片。之前的时间片没了需要再次回到就绪状态抢夺CPU时间片。

  4. 锁池:在这里找共享对象的对象锁线程进入锁池找共享对象的对象锁的时候,会释放之前占有CPU时间片,有可能找到了,有可能没找到,没找到则在锁池中等待,如果找到了会进入就绪状态继续抢夺CPU时间片。(这个进入锁池,可以理解为一种阻塞状态)

多线程的实现方式

  1. 继承java.lang.Thread类 :extends
    Thread类代表线程类,它的最主要的两个方法是:
    run():包含线程运行时所执行的代码。
    start():用于启动线程。
package extendth;
public class Machine extends Thread{public void run(){for(int a=0;a<50;a++)System.out.println(a);}public static void main(String args[]){Machine machine=new Machine();machine.start();  //启动machine线程}	
}
  1. 实现Runnable接口:implements
package runimpl;
public class Machine implements Runnable{private int a=0;public void run(){for(a=0;a<50;a++){System.out.println(Thread.currentThread().getName()+":"+a);try{Thread.sleep(100);}catch(InterruptedException e){throw new RuntimeException(e);}}}public static void main(String args[]){Machine machine=new Machine();Thread t1=new Thread(machine);Thread t2=new Thread(machine);t1.start();t2.start();}
}
  1. 线程池实现
    先创建一个线程池工具类,再调用工具类方法实现。
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;/** 线程池工具类* 使用的话 : 获取线程池: ThreadUtils.getInstance().getExecutor();*           执行任务:  ThreadUtils.getInstance().execute(Runnable runnable);*           杀死线程:  ThreadUtils.getInstance().remove(Runnable runnable);** */
public class ThreadPoolUtil {/** volatile 保证变量操作的可见性,也防止指令重排序   应用就是双锁检测的单例模式* */private static volatile ThreadPoolUtil mInstance;/*** 核心线程池的数量,同时能够执行的线程数量*/private int corePoolSize;/*** 最大线程池数量,表示当缓冲队列满的时候能继续容纳的等待任务的数量*/private int maxPoolSize;/*** 存活时间*/private long keepAliveTime = 1;private ThreadPoolExecutor executor;public ThreadPoolExecutor getExecutor() {return executor;}private ThreadPoolUtil() {//给corePoolSize赋值:当前设备可用处理器核心数*2 + 1,能够让cpu的效率得到最大程度执行(有研究论证的)corePoolSize = Runtime.getRuntime().availableProcessors() * 2 + 1;maxPoolSize = corePoolSize;TimeUnit unit = TimeUnit.HOURS;executor = new ThreadPoolExecutor(//当某个核心任务执行完毕,会依次从缓冲队列中取出等待任务corePoolSize,// 然后new LinkedBlockingQueue<Runnable>(),然后maximumPoolSize,但是它的数量是包含了corePoolSize的maxPoolSize,//表示的是maximumPoolSize当中等待任务的存活时间keepAliveTime,unit,//缓冲队列,用于存放等待任务,Linked的先进先出new LinkedBlockingQueue<>(),new DefaultThreadFactory(Thread.NORM_PRIORITY, "thread-pool-"),new ThreadPoolExecutor.AbortPolicy());}/*** 获取线程池单例*/public static ThreadPoolUtil getInstance() {if (mInstance == null) {synchronized (ThreadPoolUtil.class) {if (mInstance == null) {mInstance = new ThreadPoolUtil();}}}return mInstance;}/*** 执行任务*/public void execute(Runnable runnable) {if (executor == null) {executor = new ThreadPoolExecutor(corePoolSize,maxPoolSize,keepAliveTime,TimeUnit.SECONDS,new LinkedBlockingQueue<>(),new DefaultThreadFactory(Thread.NORM_PRIORITY, "thread-pool-"),new ThreadPoolExecutor.AbortPolicy());}if (runnable != null) {executor.execute(runnable);}}/*** 移除任务*/public void remove(Runnable runnable) {if (runnable != null) {executor.remove(runnable);}}private static class DefaultThreadFactory implements ThreadFactory {//线程池的计数private static final AtomicInteger POOL_NUMBER = new AtomicInteger(1);//线程的计数private final AtomicInteger threadNumber = new AtomicInteger(1);private final ThreadGroup group;private final String namePrefix;private final int threadPriority;DefaultThreadFactory(int threadPriority, String threadNamePrefix) {this.threadPriority = threadPriority;this.group = Thread.currentThread().getThreadGroup();this.namePrefix = threadNamePrefix + POOL_NUMBER.getAndIncrement() + "-thread-";}@Overridepublic Thread newThread(Runnable r) {Thread thread = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);// 返回True该线程就是守护线程,守护线程应该永远不去访问固有资源,如:数据库、文件等。因为它会在任何时候甚至在一个操作的中间发生中断。if (thread.isDaemon()) {thread.setDaemon(false);}thread.setPriority(threadPriority);return thread;}}//测试public static void main(String[] args) {ThreadPoolExecutor newThreadPoolExecutor=getInstance().getExecutor();for (int i = 0; i < 100; i++) {int n = i;newThreadPoolExecutor.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() +"正在执行任务");}});}}
}

使用方法:
获取线程池: ThreadUtils.getInstance().getExecutor();
执行任务: ThreadUtils.getInstance().execute(Runnable runnable);
杀死线程: ThreadUtils.getInstance().remove(Runnable runnable);

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

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

相关文章

springboot中如何加载测试专用属性

测试 加载测试专用属性 加载测试专用配置 Web环境模拟测试 数据层测试回滚 测试用例数据设定 1.在启动测试环境时可以通过properties参数设置测试环境专用的属性 SpringBootTest(properties {"test.proptestValue1"}) public class PropertiesAndArgsTest {Value(…

Web应用-Thinkphp框架-开发指南

Thinkphp框架 二级导航分类&#xff0c;模板继承&#xff0c;内置标签Public 修改MVC模块化 ——访问机制传参加载模版模版引入 分离Runtime 缓存文件管理员添加数据验证及验证场景 控制器 validate 在sql执行&#xff08;敏感操作&#xff09;之前验证数据模板 分页数据表连接…

[MoeCTF 2023] web题解

文章目录 webhttpcookie彼岸的flagmoe图床大海捞针夺命十三枪 web http 连接到本地后&#xff0c;题目给了我们任务 第一个是要求我们GET传参UwUu第二个是要求我们POST传参Luvu第三个是要求我们cookie值为admin第四个是要求我们来自127.0.0.1第五个是要求我们用MoeBrowser浏…

ajax实现原理

网页应用能够快速地将增量更新呈现在用户界面上&#xff0c;而不需要重载&#xff08;刷新&#xff09;整个页面。这使得程序能够更快地回应用户的操作 Ajax的实现原理 创建Ajax对象 传入请求方式和请求地址 发送请求 获取服务器与客户端的响应数据 xhr.responseText // 1…

C语言-程序环境和预处理(1)编译、连接介绍以及预处理函数,预处理符号详解及使用说明。

前言 本篇文章讲述了程序的翻译环境和执行环境&#xff0c;编译、连接&#xff0c;预定义符号&#xff0c;#define&#xff0c;#符号和##符号的相关知识。 文章目录 前言1.程序的翻译环境和执行环境2.编译链接2.1 翻译环境2.2 运行环境 3.预处理详解&#xff08;各预处理符号使…

基于微服务+Java+Spring Cloud开发的建筑工地智慧平台源码 云平台多端项目源码

建筑工地智慧平台源码&#xff0c;施工管理端、项目监管端、数据大屏端、移动APP端全套源码 技术架构&#xff1a;微服务JavaSpring Cloud VueUniApp MySql自主版权实际应用案例演示 建筑工地智慧平台已应用于线上巡查、质量管理、实名制管理、危大工程管理、运渣车管理、绿色…

windows系统使用cmd执行.py文件并且传入参数 | 神经网络模型训练 | 主打能用就行

0. 本文概括/ 需求 这个文章cover了一下需求&#xff1a; python环境由annaconda (conda同理)控制指定3个random seed&#xff0c;并且使用cmd命令依次执行train.pytrain.py文件需要传入参数seed&#xff0c;train.py文件中&#xff0c;需要import位于其他.py文件中自定义的cla…

凯百斯纳米盛装亮相2024济南生物发酵展专注于高压均质解决方案

凯百斯纳米技术&#xff08;上海&#xff09;有限公司盛装亮相2024济南生物发酵展&#xff0c;专注于高压均质、破碎、乳化、分散、粉碎等解决方案&#xff01; 2024第12届国际生物发酵产品与技术装备展&#xff08;济南展&#xff09;将于2024年3月5-7日在山东国际会展中心盛…

创建一个react项目 create-next-app

之前是用的creact-react-app来创建的&#xff1a;npx create-react-app my-app 现在官网却推荐使用creact-next-app: npx create-next-app 我们把他所有的选项都选上 这里的css使用了tailwind 项目结构很奇怪啊&#xff0c;没找到.html文件&#xff0c;只在src/app/layout.t…

第4章 选择结构程序设计

if语句&#xff08;if单分支、if-else双分支、else-if嵌套&#xff09;&#xff1b;switch语句;选择结构的嵌套;选择结构程序设计方法。 1.基本要求 (1)理解三种if语句的语法结构,掌握使用if语句设计选择结构程序的方法。 (2)理解switch语句的语法结构,掌握使用switch语句设计…

竞赛 深度学习LSTM新冠数据预测

文章目录 0 前言1 课题简介2 预测算法2.1 Logistic回归模型2.2 基于动力学SEIR模型改进的SEITR模型2.3 LSTM神经网络模型 3 预测效果3.1 Logistic回归模型3.2 SEITR模型3.3 LSTM神经网络模型 4 结论5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 …

centos离线安装telnet、traceroute工具

安装包下载地址 安装包下载地址在这里 直接输入包名&#xff0c;筛选系统&#xff0c;根据自己系统版本确定该下哪个包 centos离线安装telnet 准备三个安装包 xinetd-2.3.15-14.el7.x86_64.rpmtelnet-server-0.17-65.el7_8.x86_64.rpmtelnet-0.17-65.el7_8.x86_64.rpm 三个…

latex如何对.pdf格式的图片实现裁剪

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 在使用draw.io进行绘图&#xff0c;导出的时候不知道为什么周围会有留白&#xff0c;比如下图&#xff1a; 在导入latex的时候&#xff0c;会因为两侧的留白导致整张图片缩小。 如果直接进行裁剪.pdf&a…

学习记忆——数学篇——案例——代数——不等式——一元二次不等式

重点记忆法 归类记忆法 解一元二次不等式的步骤 1.先化成标准型&#xff1a; a x 2 b x c > 0 ( 或 < 0 ) ax^2bxc>0(或<0) ax2bxc>0(或<0)&#xff0c;且a >0&#xff1b; 2.计算对应方程的判别式 △ △ △&#xff1b; 3.求对应方程的根&#xff1b…

Apache_Log4j2查找功能JNDI注入_CVE-2021-44228

Apache_Log4j2查找功能JNDI注入_CVE-2021-44228 文章目录 Apache_Log4j2查找功能JNDI注入_CVE-2021-442281 在线漏洞解读:2 环境搭建3 影响版本&#xff1a;4 漏洞复现4.1 访问页面4.2 poc漏洞验证 4.3 在dnslog获取个域名4.4 使用bp抓包进行分析4.5 通信成功&#xff0c;此处可…

有外媒称,Linux 发行版Ubuntu 23.10也将正式支持树莓派 5

据了解&#xff0c;在树莓派 4 单板计算机推出 4年后&#xff0c;树莓派 5也在上月末正式发布&#xff0c;并且两者对比之后可以发现&#xff0c;树莓派 5主要提升性能是添加了对 PCIe 2.0的支持。 Multiable万达宝医疗ERP(www.multiable.com.cn/solutions_yl)具备严格的保质期…

Windows中将tomcat以服务的形式安装,然后在服务进行启动管理

Windows中将tomcat以服务的形式安装,然后在服务进行启动管理 第一步&#xff1a; 在已经安装好的tomcat的bin目录下&#xff1a; 输入cmd&#xff0c;进入命令窗口 安装服务&#xff1a; 输入如下命令&#xff0c;最后是你的服务名&#xff0c;避免中文和特殊字符 service.…

cartographer中的扫描匹配

cartographer中的扫描匹配 cartographer中使用了两种扫描匹配方法&#xff1a;CSM&#xff08;相关性扫描匹配方法&#xff08;暴力匹配&#xff09;&#xff09;、ceres优化匹配方法 CSM可以简单地理解为暴力搜索&#xff0c;即每一个激光数据与子图里的每一个位姿进行匹配&…

用 SQL 找出某只股票连续上涨的最长天数

涉及多张中间表: SELECT MAX(consecutive_day) FROM (SELECT COUNT(*) as consecutive_dayFROM (SELECT trade_date, SUM(rise_mark) OVER (ORDER BY trade_date) AS days_no_gainFROM (SELECT trade_date,CASEWHEN closing_price > LAG(closing_price) OVER (ORDER BY tra…

为什么手机会莫名多出许多软件?

许多手机用户都曾遭遇过这样的问题&#xff0c;他们在使用手机的过程中&#xff0c;突然发现手机屏幕上出现了一些未知的软件。这些软件并非他们主动下载的&#xff0c;但它们却显现在屏幕上。这些软件从何而来&#xff1f; 其实&#xff0c;这些软件往往是在浏览网页、阅读小…