多线程之基础篇(一)

news2025/1/4 20:36:07

一、Thread类

1、线程的创建 

大家都熟知创建单个线程的三种方式,通过继承Thread类创建线程并重写该类的run()方法;通过实现Runnable接口创建线程一样要重写run()方法;以上的两个run()方法都是线程的执行体;第三,使用Callable和Future来创建线程Callable接口提供了一个call()方法来作为线程的执行体,call()方法比run()方法功能要更加强大,call()方法可以有返回值,call()方法可以声明抛出异常(前两种如果要抛异常只能通过try,catch来实现);下面详细介绍一下Callable和Future

我们知道创建线程最终要由操作系统支持,java中只有调掉Thread对象,最后执行一个叫private native void start0();的本地方法,而该方法的最终实现在C++和C层面,要阅读JVM源码才能更深一步,暂时咱们知道最后是由操作系统给我们另起了一个线程取执行 “执行体”里面的业务。我们看Thread类的构造方法里面没有直接传Callable接口的构造方法,那为啥我们还能运行下面这段代码呢?

    /**
     * Callable需要配合FutureTask使用
     * FutureTask的get()可以返回任务的执行结果,方便在2个线程之间,把一个线程的结果传给另一个线程
     *
     * @throws InterruptedException
     * @throws ExecutionException
     */
    private static void testFutureAndCallable() throws InterruptedException, ExecutionException {
        FutureTask<Integer> future = new FutureTask<>(() -> {
            log.debug("running.....");
            Thread.sleep(1000);
            return 100;
        });

        Thread t3 = new Thread(future, "t3");
        t3.start();

        // 当主线程运行到get方法时,主线程会阻塞住,一直等待 t1线程 结果返回
        log.debug("main接收future的返回值:{}",future.get());
        log.debug("main线程继续运行....");
    }

我们可以看到,直接把future对象传入给了Thread构造方法,其实我们可以从FureTask出发, FutureTask实现了RunnableFuture接口,而RunnableFuture又同时实现了Runnable和Future接口,所以在直接构造Thread时可以直接传入构造参数执行。

public class FutureTask<V> implements RunnableFuture<V> {}

public interface RunnableFuture<V> extends Runnable, Future<V> {}

尽管FureTask+Callable有返回值,可以抛异常,可以查看线程执行任务的情况,但是有时候为获取它的返回值主线程而陷入阻塞等待,另一个isDone()方法轮询获取值容易耗CPU资源.........

针对以上2个痛点JDK做了扩展CompletableFuture类同时实现了Future和CompletionStage接口,在CompletionStage上做了极大的扩展

Runnable——没有输入参数,也没有返回值

Function——功能型函数接口,有一个参数,有一个返回参数

Consumer——消费型函数接口,有一个输入参数,没有返回参数

—Consumer延申BiConsumer,有两个输入参数,没有返回参数

Supplier——供给型函数接口,没有输入参数,有返回值

数式接口名称方法名称参数返回值
Runnablerun无参数无返回值
Functionapply1个参数有返回值
Consumeraccept1个参数无返回值
Supplierget无参数有返回值
BiConsumeraccept2个参数

无返回值

2、interrupt()、interrupted()、isinterrupted()  

public void interrupt()

实例方法

,Just to set the interrupt flag

实例方法interrupt()仅仅是设置线程的中断状态为true,发起一个协商而不会立刻停止线程。

如果线程处于被阻塞状态(例如处于sleep,wait,join等状态),在别的线程中调用当前线程对象的interrupt方法,那么线程将立即退出被阻塞状态,并抛出一个InterruptException异常。

public static boolean interrupted()

静态方法,Thread.interrupted();

判断线程是否被中断并清除当前中断状态。

这个方法做了两件事

1.返回到当前线程的中断状态,测试当前线程是否已被中断。

2.将当前线程的中断状态清零并重新设为false,清除线程的中断状态

public boolean isInterrupted()

实例方法

判断当前线程是否被中断(通过检查中断标志位)

二、Java的锁  

乐观锁:

        1、版本号version

        2、CAS(compareAndSwap)算法,java原子类(Atomic打头的类)中的递增操作就是通过CAS自旋实现的。——Unsafe类

使用场景:适合读操作多的场景,不加锁的特点能够使其读取操作的性能大幅提升。乐观锁则直接去操作同步资源,是一种无锁算法

悲观锁: 同一时间点有且仅有一个线程占有锁

        1、synchronized

        2、ReentrantLock

使用场景:适合写操作多的场景,先加锁可以保证写操作时数据正确,现实的锁定之后在操作同步资源 

1、synchronized

 为什么任何一个对象都可以成为一把锁?

因为Java中所有的对象都默认继承了超类Object,而Object在JVM源码(C++)层面关联了一个对象ObjectMonitor,所以每个对象“天生”都带着一个对象监视器,也就是每一个被锁住的对象都会和Monitor关联起来。

 ObjectMonitor中有几个关键属性

_owner指向持有ObjectMonitor对象的线程
_WaitSet存放于wait状态的线程队列
_EntryList存放处于等待锁block状态的线程队列
_recursious锁的重入次数
_count用来记录该线程获取锁的次数

管程:Monitors,也叫监视器

是一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥访问共享资源。这些共享资源一般是硬件设备或一群变量。对共享变量能够进行的所有操作集中在一个模块中。(把信号量及其操作原语“封装”在一个对象内部)管程实现了在一个时间点,最多只有一个线程在执行管程的某个子程序。管程提供了一种机制,管程可以看作一个软件模块,它是将共享的变量和对于这些共享变量的操作封装起来,形成一个具有一定接口的功能模块,进程可以调用管程来实现进程级别的并发控制。

注:synchronized和 static synchronized前者是对象锁,后者是类锁,属于不同的锁,a线程加对象锁,b线程加类锁,加锁不同,a、b线程不会产生竟态条件。

 2、自旋锁

没有成员变量的类一般都是线程安全的

cynchronized

 

 

并发压测工具 

 

 装饰器模式:Collections以synchronized打头的的实现集合的那些方法就是采用了装饰器模式。

1、AQS

AQS全称是AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架

特点:

1、用state属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁

—getState-获取state状态

—setState-设置state状态

—compareAndSetState-cas机制设置state状态[compare式保证state的原子性]

2、提供了基于FIFO的等待队列,类似于Monitor的EntryList

3、条件变量来实现等待、唤醒机制,支持多个条件变量,类似于Montor的WaitSet

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

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

相关文章

Matlab学习-自定义函数

Matlab学习-自定义函数 常用自定义函数 文章目录 Matlab学习-自定义函数1. 打印时间2. 计算统计参数3. 画图函数 1. 打印时间 function result calculate_time(time)% Function describe : calculate time% Input : time:N*1% Output : result.hour/min/sec hour/min/sec…

Linux 下静态库与动态库的制作与使用

Linux 下静态库与动态库的制作与使用 文章目录 Linux 下静态库与动态库的制作与使用示例代码&#xff1a;静态库静态库制作静态库使用 动态库动态库制作动态库使用 示例代码&#xff1a; test.c test.h main.c 静态库 静态库制作 以示例代码为例&#xff0c;先执行下面…

FPGA实现“乒乓操作”

一、“乒乓操作”概述 1、结构 “乒乓操作”是一种常用于数据流控制的处理技巧&#xff0c;可以实现无缝高速数据流缓存。首先“乒乓操作”这个名字本身就很吸引人&#xff0c;其结构一般是由数据选择器和数据缓冲器构成的&#xff0c;数据缓冲模块可以为任何存储模块&…

【MySQL数据库原理】MySQL Community 8.0界面工具汉化

尝试以下方法来汉化 MySQL Workbench 8.0 的菜单&#xff1a; 1、使用社区翻译版本&#xff1a;有一些热心的社区成员会将 MySQL Workbench 翻译成不同的语言&#xff0c;包括中文。你可以在一些开源或社区网站上寻找这些翻译版本&#xff0c;并按照他们的说明进行安装。 2、…

抖音外卖平台区域代理怎么拿?送上申请教程!

作为占据庞大流量的短视频平台&#xff0c;它的一举一动都格外引人注意。年初&#xff0c;抖音短视频平台开始大力进军本地生活市场&#xff0c;除了开通团购业务外&#xff0c;还准备做短视频外卖&#xff0c;这一举动&#xff0c;立刻掀起了今年火热的创业浪潮。 要知道&…

sql server服务无法启动怎么办?如何正常启动?

sql server软件是一款关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点。并且有些应用软件使用过程中是需要sql server数据库的后台支持的&#xff0c;我们在数据编程操作时经常会使用这款编程软件&#xff0c;在编程时系统有时会提示sql server服务无…

pandas读取一个 文件夹下所有excel文件

我这边有个需求&#xff0c;是要求汇总一个文件夹所有的excel文件&#xff0c; 其中有.xls和 .xlsx文件&#xff0c;同时还excel文件中的数据可能还不一致&#xff0c;会有表头数据不一样需要一起汇总。 首先先遍历子文件夹并读取Excel文件&#xff1a; 使用os库来遍历包含子文…

在自定义数据集上实现OpenAI CLIP

在2021年1月&#xff0c;OpenAI宣布了两个新模型:DALL-E和CLIP&#xff0c;它们都是以某种方式连接文本和图像的多模态模型。CLIP全称是Contrastive Language–Image Pre-training&#xff0c;一种基于对比文本-图像对的预训练方法。为什么要介绍CLIP呢&#xff1f;因为现在大火…

阅读分享--重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文

重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文 https://zhuanlan.zhihu.com/p/52169807 废话不多说,下面就跟大家分享一下两次拜读这篇论文的不同体验和收获。 第一遍读这篇论文的时候,我想所有人都是冲着算法的架构去的,在深度学习推荐系统已经成为各大公司“基本…

Linux下安装部署Tomcat8_图解_保姆级教程

检查工作 tomcat依赖于JDK ,所以我们要先检查 Linux 下是否安装了JDK并配置了环境变量 java -version // 查看JDK版本号如需安装JDK,请参考: Linux下安装JDK,巨详细 1.将安装包放到自己所建立的文件夹之下 我这里采用的软件是Xftp,创建一个文件夹,将Xftp的路径指向刚刚创…

一站式开源持续测试平台 MerterSphere 之测试跟踪操作详解

一、MeterSphere平台介绍 MeterSphere是一站式的开源持续测试平台&#xff0c;遵循 GPL v3 开源许可协议&#xff0c;涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&#xff0c;全面兼容JMeter、Selenium 等主流开源标准&#xff0c;有效助力开发和测试团队充分利用云弹性…

这一次,大模型颠覆广告行业!

本文源自&#xff1a;量子位 百度用大模型重构一切&#xff0c;包括现金奶牛业务。 就在刚刚&#xff0c;百度营销官宣接入文心一言&#xff0c;推出新一代营销平台轻舸&#xff0c;也是全球首个AI Native的营销平台。 这么说吧&#xff0c;是有点颠覆互联网广告投放模式内味…

网络安全(红客)自学

前言 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多 google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解决. …

电脑文件一团乱?试试这个高效率的管理软件

如果你经常被电脑文件管理搞得一团乱&#xff0c;不妨试试这款高效率的文件管理软件——固乔文件管家。下面是如何使用这款软件进行文件管理的详细步骤。 首先&#xff0c;打开浏览器并搜索“固乔文件管家”这款软件。搜索到后&#xff0c;点击下载并安装。安装完成后&#xff…

2023-亲测有效-git clone失败怎么办?用代理?加git?

git 克隆不下来&#xff0c;超时 用以下格式&#xff1a; git clone https://ghproxy.com/https://github.com/Tencent/ncnn.git 你的网站前面加上 https://ghproxy.com/ 刷的一下就下完了&#xff01;&#xff01;

【股票价格预测】基于改进莱维飞行和混沌映射的粒子群优化BP神经网络预测股票价格研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

面试项目-黑马头条-项目介绍

1 项目介绍 B站视频黑马头条视频学习总结&#xff0c;侵权请联系删除 1.1 项目背景 随着智能手机的普及&#xff0c;人们更加习惯于通过手机来看新闻。由于生活节奏的加快&#xff0c;很多人只能利用碎片时间来获取信息&#xff0c;因此&#xff0c;对于移动资讯客户端的需求也…

薪资17K+需要什么水平?98年测试工程师面试实录…

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;本科&#xff0c;三年多测试工作经验&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能&#xff0c;然而到今天都没有收到一份offer&#xff01;从年后就开始准备简历&#xff0c;年…

从官方文档看Redis

一.核心能力 Redis 1.In-memory data structures 内存数据结构 Redis以"键值对" 的方式来存储数据, 是一种"非关系型数据库" ps: MySQL以"表"的方式来存储数据, 是一种"关系型数据库" 2.Programmability 可编程性 Redis可以用脚本…

Eclipse 安装串口终端工具

Eclipse已集成串口终端显示&#xff0c;只需要我们自己下载安装即可使用。使用SSH连接也差不多。 查看eclipse版本信息 help->About Eclipse 查看version&#xff0c;我的是4.7.3a&#xff0c;记住代号&#xff0c;我的是“Oxygen”,下面有用。 安装eclipse自带的“Termin…