JUC之线程、线程池

一、start与run方法

start方法开启一个新线程,异步执行。

run方法同步执行,不会产生新的线程。

start方法只能执行一次,run方法可以执行多次。

二、一些方法

sleep() 线程睡眠

两种方式调用:

Thread.sleep(1000);TimeUnit.SECONDS.sleep(1);

线程打断

interrupt()这种方式打断,线程会抛出InterruptedException异常。比如在线程睡眠的时候,调用interrupt(),线程抛出异常。抛出InterruptedException异常的时候会清除中断标记。

interrupt()方法仅仅是将线程的中断状态设置为true,并不会停止线程。

thread.interrupt();

还有两个方法

isInterrupted()判断当前线程是否被打断,不会清除打断标记。

interrupted();判断当前线程是否被打断,清除打断标记,静态方法。清除打断标记就是恢复线程的 中断状态。也就是说,在调用Thread.interrupted()方法之后,如果中断了此线程,则不会抛出中断异常,但是如果第二次调用Thread.interrupted()方法的话直接返回false,除非有第二次中断触发。

boolean isInterrupted = thread.isInterrupted();boolean interrupted = Thread.interrupted();

yield()线程让步

只是让出CPU资源,停止执行当前线程的动作,当前线程的状态回到可运行状态。但是当前线程做出让步以后,下一个CPU资源会在哪个线程的身上,取决去调度器,调度器会在同等优先级的线程之间选择一个分配资源。

设置/获取优先级

优先级设置越大,获得CPU资源的可能性就越高。默认优先级使5,最小1,最大10。

thread.setPriority(10);int priority = thread.getPriority();

join()等待线程结束

join()

join(long time)

上述两个方法都是等待线程结束,即在执行的地方先等待子线程运行结束再往下继续运行主线程。带参数的是最大等待时间,时间一到则不再等待子线程,主线程继续往下运行。一些场景就是主线程运行依赖于子线程的运行结果。

isAlive()

当前线程是否存活

守护线程

线程分为守护线程和用户线程。默认为用户线程。

setDaemon(boolean on)设置当前线程为守护线程

isDaemon()判断当前线程是否为守护线程。

线程的几种状态和转换

创建线程的三种方式

1、继承Thread类

Thread t = new MyThread();
t.start();public static class MyThread extends Thread {@Overridepublic void run() {System.out.println("my thread");}
}

这种方式是继承的方式,因为java是单继承,所以一般用的不多。

2、实现Runnable,重写run()方法

Thread t1 = new Thread(new RunnableThread());
t1.start();public static class RunnableThread implements Runnable {@Overridepublic void run() {System.out.println("runnable thread ... ");}}

这种实现接口的方式推荐使用

3、实现callable,重写call()方法

实现callable的方式,重写的call方法有返回值,这点和Runnable的接口有所不同,并且是交给FutureTask管理,通过future.get()可以获得call()方法的返回值。

注意的是,调用future.get()方法的时候,线程会等待call()方法执行完成,拿到返回值以后才会继续往下执行。

FutureTask futureTask = new FutureTask(new CallableThread());
futureTask.run();
String res = (String) futureTask.get();public static class CallableThread implements Callable<String> {@Overridepublic String call() throws Exception {System.out.println("callable thread ... ");TimeUnit.SECONDS.sleep(5);return "callable";}}

如果不需要返回值的话,用的最常见的就是第二种实现Runnable的方式,并且用lambda的方式,比如:

new Thread(()->{System.out.println("thread start ...");}).start();

线程池

集中管理线程,节省资源,线程复用,减少开销,便于维护。

Executors提供了固定的几种线程池的创建方式。

1、Executors.newFixedThreadPool(5);创建固定大小的线程池,参数是线程数量

2、Executors.newSingleThreadExecutor();创建只有一个线程数量的线程池
3、Executors.newCachedThreadPool();创建可以扩容的线程池,会一直增加线程数量,不建议使用。

上述3中线程池执行方法:

executorService.execute(()->{});传入Runnable对象

4、Executors.newScheduledThreadPool(5);创建有定时任务的线程池

这种线程池执行的方式scheduledExecutorService.schedule(()->{},5,TimeUnit.SECONDS);

第一个参数是Runnable对象,第二个参数是延迟时间,第三个参数是时间单位。

关闭线程池

shutdown(),等待所有的任务执行完毕关闭线程池。

shutdownNow(),等待正在执行的任务执行完毕后关闭线程池。

awaitTermination(10, TimeUnit.SECONDS),等待所有任务执行完毕,或者超时以后线程池关闭

isTerminated()线程池是否关闭

线程池的execute和submit方法区别

1、参数不同

execute()方法接收的是Runnable参数

submit接收的是Runnable或者Callable参数

2、返回值不同

execute()方法没有返回值

submit方法有返回值,返回的是Future类型,通过future.get()获得具体的结果。

注意:如果execute传入的是FutureTask类型的话,其实也是可以接收返回结果的。只不过submit替我们封装了FutureTask。

ExecutorService executorService = Executors.newFixedThreadPool(5);
Future<String> future = executorService.submit(() -> {return "123";});String s = future.get();System.out.println("s " + s);FutureTask<String> futureTask = new FutureTask(() -> {return "hello";});executorService.execute(futureTask);System.out.println("futuretask " + futureTask.get());

3、异常捕捉

execute()执行的子线程中的异常,只能子线程进行处理,主线程无法处理,即无法进行 程序的统一异常处理。

submit()中子线程的异常可以在主线程中进行统一异常处理,因为子线程出现异常的时候,并不会立即报错,在进行future.get()进行获取结果的时候才抛出异常,所以主线程可以进行统一异常处理。

自定义线程池

参数

corePoolSize:核心线程数

maximumPoolSize:最大线程数

keepAliveTime:非核心线程空闲状态存活时间

unit:存活时间单位

workQueue:工作/阻塞队列,

线程先加入到核心线程,核心线程数量达到以后,就会加入到阻塞队列,当阻塞队列满了以后加入非核心线程。

threadFactory:线程工厂

handler:拒绝策略

当线程已经超过了最大线程数加上阻塞队列的数量,就会触发拒绝策略

有四种拒绝策略:

AbortPolicy:拒绝新任务并抛出异常

DiscardPolicy:丢弃任务,不会抛异常

DiscardOldestPolicy:丢弃老的未处理的任务,新的任务加入队列

CallerRunsPolicy:自己处理新的任务,处理的逻辑在传入的Runnable方法中实现。

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,3,0,TimeUnit.SECONDS,new LinkedBlockingQueue<>(2),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());try {for (int i = 0; i < 50; i++) {Task task = new Task(i);threadPoolExecutor.submit(task);}}catch (Exception e){e.printStackTrace();}finally {threadPoolExecutor.shutdown();}
public static class Task implements Runnable {int i;public Task(int i) {this.i = i;}@Overridepublic void run() {try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("thread: "+Thread.currentThread().getName()+" ... ...");}}

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

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

相关文章

SAP MRP中的滚动提前期简介(MRP自动删除已固定计划订单)

通常被标记了固定标识的计划订单在运行MRP的时候系统是不会自动删除这部分计划订单的,但是SAP提供了“滚动提前期”这一功能,允许我们通过设定规则,在MRP运算的同时,自动删除在规定期间范围内的被固定的计划订单,从而避免这种干扰MRP运算的现象发生。 下面我们模拟这个场…

SignalR中的重连机制和心跳监测机制详解

一. 重连机制 声明&#xff1a;   本节仅介绍重连机制和心跳监测机制&#xff0c;基于Core 3.1框架&#xff0c;至于SignalR其它的一些基本使用&#xff0c;包括引入、Hub、配置等常规操作&#xff0c;在本节中不介绍&#xff0c;后续写Core下的SignalR 说明   默认是没有重…

钥匙和房间

题目链接 钥匙和房间 题目描述 注意点 所有 rooms[i] 的值 互不相同如果能进入所有房间返回true&#xff0c;否则返回falserooms[i] 是进入 i 号房间可以获得的钥匙集合 解答思路 可以通过深度优先遍历找到所有可以访问的房间&#xff0c;需要注意的是同一个房间不能重复访…

2024.4.26

//异或 Complex Complex::operator^(const Complex c1){Complex temp;temp.relthis->rel^c1.rel;temp.virthis->vir^c1.vir;return temp; }//按位取反 Complex Complex::operator~(){this->rel~this->rel;this->vir~this->vir;return* this; } //左移 Comple…

vue+element之解决upload组件上传文件失败后仍显示在列表上、自动上传、过滤、findIndex、splice、filter

MENU 前言错误案例(没有用)正确方法结束语 前言 el-upload上传失败后&#xff0c;文件仍显示在列表上。 这个pdf文件上传失败&#xff0c;仍显示在列表&#xff0c;给人错觉是上传成功&#xff0c;所以要把它去掉。 在element中&#xff0c;file-list和v-model:file-list是用于…

Bun 入门到精通(一)

Bun 是什么&#xff1f; Bun 是用于 JavaScript 和 TypeScript 应用程序的多合一工具包。它作为一个名为 bun 的可执行文件提供。 其核心是 Bun 运行时&#xff0c;这是一个快速的 JavaScript 运行时&#xff0c;旨在替代 Node.js。它是用 Zig 编写的&#xff0c;并由 JavaSc…

Matlab|交直流系统潮流计算(含5种控制模式)

目录 1 主要内容 程序参考流程图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《交直流系统潮流计算及相互关联特性分析》&#xff0c;采用5种交直流潮流控制方式&#xff1a;1.定电流定电压 2.定电流定熄弧角 3.定功率定电压 4.定功率定熄弧角 5.定触发角…

Kafka 生产者应用解析

目录 1、生产者消息发送流程 1.1、发送原理 2、异步发送 API 2.1、普通异步发送 2.2、带回调函数的异步发送 3、同步发送 API 4、生产者分区 4.1、分区的优势 4.2、生产者发送消息的分区策略 示例1&#xff1a;将数据发往指定 partition 示例2&#xff1a;有 key 的…

经典的免费wordpress模板

这款经典的免费WordPress模板以鲜艳的红色为主调&#xff0c;充满了活力与热情。设计简洁而现代&#xff0c;适合各种类型的项目网站。模板采用响应式设计&#xff0c;确保在不同设备和屏幕尺寸上都能呈现出完美的视觉效果。 红色象征着激情、活力和自信&#xff0c;这款模板…

2024年Q1企业邮箱安全性研究报告:钓鱼邮件同比增长59.9%

4月23日&#xff0c;Coremail邮件安全联合北京中睿天下信息技术有限公司发布《2024年第一季度企业邮箱安全性研究报告》。对当前企业邮箱的应用状况和安全风险进行了分析。 1、垃圾邮件持续增长 根据Coremail邮件安全人工智能实验室最新数据显示&#xff0c;2024年第一季度&am…

4 -26

4-26 1 英语单词100个一篇六级翻译 2 div 4 补题目 3 概率论期中卷子一张&#xff0c;复习复习。 4 备课ing 晚上出去炫饭&#xff0c;串串香&#xff0c;无敌了。 中间一些模拟题是真的恶心&#xff0c;思维题是真的想不到&#xff0c;感觉自己就是一个废物呢。 1.是将一个数…

[C++]STL---unordered_set与unordered_map的模拟实现

目录 前言 哈希桶的改造 哈希桶的初步改造 迭代器的模拟实现 operator() 类互相typedef时的前置声明 友元声明 迭代器的出口 插入Insert() 查找Find(&#xff09; 哈希表的最终改造 unordered_set的模拟实现 unordered_map的模拟实现 前言 unordered_set与set的区…

运行游戏提示dll文件丢失,分享多种有效的解决方法

在我们日常频繁地利用电脑进行娱乐活动&#xff0c;特别是畅玩各类精彩纷呈的电子游戏时&#xff0c;常常会遭遇一个令人困扰的问题。当我们满怀期待地双击图标启动心仪的游戏程序&#xff0c;准备全身心投入虚拟世界时&#xff0c;屏幕上却赫然弹出一条醒目的错误提示信息&…

最受站长欢迎的wordpress模板

蓝色与黄色&#xff0c;作为经典的互补色&#xff0c;它们在企业网站设计中总能碰撞出令人印象深刻的火花。当这两种鲜艳的色彩巧妙结合时&#xff0c;不仅能够吸引访客的注意力&#xff0c;还能传达出一种活力四射、积极向上的企业形象。 今天&#xff0c;我们为您推荐的这款…

LAPGAN浅析

LAPGAN 引言 在原始 GAN和CGAN中&#xff0c;还只能生成 16*16, 28*28, 32*32 这种低像素小尺寸的图片。而LAPGAN首次实现 64*64 的图像生成。与其一下子生成这么大的图像 &#xff08;包含信息量这么多&#xff09;&#xff0c;不如一步步由小到大&#xff0c;这样每一步生成…

书籍推推荐之二--《生命的色彩》

史钧《生命的色彩》 在生活中&#xff0c;我们会注意到一个有趣的现象&#xff1a;每个人的头发颜色各不相同&#xff0c;有黑色、灰色、黄色、棕红色、银白色等&#xff0c;但就是没有绿色。对于生活在丛林中的早期人类来说&#xff0c;绿色的头发简直就是天然的迷彩服&#x…

随手记:树结构翻页和定位指定数据逻辑

业务背景&#xff1a; 树形组件展示数据&#xff0c;数据包含过去数据&#xff0c;现在数据&#xff0c;未来数据&#xff0c;用户在首次进入页面时&#xff0c;展示的是当天的数据&#xff0c;如果当天没有数据&#xff0c;则显示最近一条的过去数据。数据按照时间越长数据会…

可替代IBM DOORS的现代化需求管理解决方案Jama Connect,支持数据迁移及重构、实时可追溯性、简化合规流程

作为一家快速发展的全球性公司&#xff0c;dSPACE一直致力于寻找保持领先和优化开发流程的方法。为推进其全球现代化计划&#xff0c;dSPACE开始寻找可以取代传统需求管理平台&#xff08;IBM DOORS&#xff09;的需求管理解决方案。 通过本次案例&#xff0c;您将了解dSPACE为…

大数据第五天(操作hive的方式)

文章目录 操作hive的方式hive 存储位置hive 操作语法创建数据表的方式 操作hive的方式 hive 存储位置 hive 操作语法 创建数据表的方式 – 创建数据库 create database if not exists test我们创建数据库表的时候&#xff0c;hive是将我们的数据自动添加到数据表中&#xf…

江苏开放大学2024年春《机电设备安装与调试 050095》第三次形成性考核作业参考答案

电大搜题 多的用不完的题库&#xff0c;支持文字、图片搜题&#xff0c;包含国家开放大学、广东开放大学、超星等等多个平台题库&#xff0c;考试作业必备神器。 公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#…