JUC的常见类

Callable interfacce

也是一种创建线程的方式
Runnable 能表示一个任务(run方法),返回void
Callable 也能表示一个任务(call方法),返回一个具体的值,类型可以通过泛型参数来指定(object)
如果进行多线程操作,如果你只是关心多线程的执行过程,使用Runnable即可,如果是关心多线程的计算结果,使用Callable更合适
使用Callable不能直接作为Thread的构造方法参数,我们可以借用FutureTask来完成
,运算的结果什么时候能算出来,可以使用FutureTask来帮助我们解决这个问题

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class demo2 {public static void main(String[] args) throws ExecutionException, InterruptedException {Callable<Integer> callable = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int sum =0;for (int i =0;i<1000;i++){sum +=i;}return sum;}};FutureTask<Integer> futureTask =new FutureTask<>(callable);Thread t1 =new Thread(futureTask);t1.start();//获取call方法返回的结果,get类似于join,如果call方法没有执行完,就会阻塞等待Integer result = futureTask.get();System.out.println(result);}
}

在这里插入图片描述

ReentrantLock

可重入互斥锁. 和 synchronized 定位类似, 都是用来实现互斥效果, 保证线程安全.

ReentrantLock 的用法:
lock(): 加锁, 如果获取不到锁就死等.
trylock(超时时间): 加锁, 如果获取不到锁, 等待一定的时间之后就放弃加锁.
unlock(): 解锁
虽然synchronized也是一个可重入锁,但是这两者还是又明显的区别的

ReentrantLock的优点

1.提供了一个trylock的方法进行加锁
对于lock操作来说,如果加锁不成功,就会出现阻塞等待(死等).
对于trylock,如果加锁失败,直接返回false/也可以设定等待时间,该方法给锁操作提供了更多的可操作空间
2.有两种模式,可以工作在公平锁的状态下,也可以工作在非公平锁的状态下,构造方法中可以通过参数设定的公平/非公平模式
3.也有一个等待通知机制,搭配condition这样的类来完成,这里的等待要比wait notify功能更强

ReentrantLock的缺点

unlock()解锁方法容易被人忘记,常常需要搭配finally来使用
synchronized的锁对象可以是任意对象
ReentrantLock的锁对象就只能是自己本身,如果多个线程针对不同的ReentrantLock调用lock方法,此时是不会产生锁竞争的

原子类

原子类内部用的是 CAS 实现,所以性能要比加锁实现 i++ 高很多。原子类有以下几个

AtomicBoolean
AtomicInteger
AtomicIntegerArray
AtomicLong
AtomicReference
AtomicStampedReference

以 AtomicInteger 举例,常见方法有

addAndGet(int delta); i += delta;
decrementAndGet(); --i;
getAndDecrement(); i–;
incrementAndGet(); ++i;
getAndIncrement(); i++;
(具体可看CAS详解)

线程池

虽然创建销毁线程比创建销毁进程更轻量, 但是在频繁创建销毁线程的时候还是会比较低效.
线程池就是为了解决这个问题. 如果某个线程不再使用了, 并不是真正把线程释放, 而是放到一个 “池子”
中, 下次如果需要用到线程就直接从池子中取, 不必通过系统来创建了.
(具体可看线程池详解)

信号量Semaphore

在操作系统中,也经常出现,是并发编程的一个重要的概念/组件
准确来说,Semaphore是一个计数器(变量),描述了"可用资源的个数",描述的是,当前这个线程,是否有"临界"资源可以用,所谓的临界资源,是指的多个线程/进程等并发执行的实体可以公共使用到的资源(多个线程修改同一个变量,这个变量就可以被认为是一个临界资源)

示例

停车场景:
停车场的入口,上面会挂这一个显示屏,上面会显示停车场内可用的车位
如果开车进入停车场,申请一个车位(申请了一个可用资源),此时计数器就会+1,称为p操作
如果开车离开停车场,释放了一个车位(释放了一个可用资源),此时计数器就会-1,称为v操作
如果发现车位计数器上面的计数器为0,这个时候,有两种选择:
1.等
2.放弃,寻找下个车位
这里我们选择第一种操作,继续进行p操作,就会阻塞等待,一直等到其他车辆进行了v操作,释放了一个空闲的车位为止,
锁,本质上是一个特殊的信号量(里面的数值,非0即1,二元信号量),信号量要比锁更广义,不仅仅可以描述一个资源,还可以描述N个资源,虽然概念上更广泛,实际开发中,还是锁更多一些(二元信号量的场景是更常见的)

package Thread;import java.util.concurrent.Semaphore;public class demo3 {public static void main(String[] args) throws InterruptedException {//构造方法中,就可以用来指定计数器的初始值Semaphore semaphore = new Semaphore(4);semaphore.acquire();//计数器-1System.out.println("执行p操作");semaphore.acquire();//计数器-1System.out.println("执行p操作");semaphore.acquire();//计数器-1System.out.println("执行p操作");semaphore.acquire();//计数器-1System.out.println("执行p操作");semaphore.acquire();//计数器-1System.out.println("执行p操作");}
}

在这里插入图片描述

CountDownLatch

同时等待n个任务执行结束

好像跑步比赛,10个选手依次就位,哨声响才同时出发;所有选手都通过终点,才能公布成绩

构造 CountDownLatch 实例, 初始化 10 表示有 10 个任务需要完成.
每个任务执行完毕, 都调用 latch.countDown() . 在 CountDownLatch 内部的计数器同时自减.
主线程中使用 latch.await(); 阻塞等待所有任务执行完毕. 相当于计数器为 0 了.

package Thread;import java.util.concurrent.CountDownLatch;public class demo1 {public static void main(String[] args) throws InterruptedException {//相当于创建一个线程任务为10的计数器CountDownLatch countDownLatch = new CountDownLatch(10);for (int i = 0;i<10;i++){//防止因为变量捕获的机制使得无法正常访问i变量int id =i;Thread t = new Thread(()->{System.out.println("线程"+id+"开始工作");try {//使用sleep来代指某些耗时操作Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程"+id+"结束工作");//每次调用countDown就相当于使得计数器减一countDownLatch.countDown();});t.start();}//如果计数器没有减到0,就会进入阻塞等待countDownLatch.await();System.out.println("多个线程的所有任务都执行完毕");}
}

在这里插入图片描述

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

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

相关文章

利用adobe audition cc2014中置声道提取制作伴奏

“adobe audition cc2014制作伴奏”这四个字我在网上查了半个月了&#xff0c;但还是没查着解决方法&#xff0c;于是&#xff0c;我便自己琢磨做了做。 准备&#xff1a;adobe audition cc2014&#xff0c;歌曲(最好是无损格式&#xff09;。 1.打开 adobe audition cc2014 2.…

会声会影提取伴奏乐教程

2019独角兽企业重金招聘Python工程师标准>>> 时常会遇到这样的问题&#xff0c;看到一段精彩的视频&#xff0c;发现它的伴奏不错&#xff0c;想提取出来。遇到这种情况&#xff0c;会声会影有什么好办法吗&#xff0c;怎样提取伴奏乐呢&#xff1f; 一、首先打开视…

JAVA中如何知道某项目使用什么数据库类型

文章目录 1. 前言2. 先说结论3. 代码案例 1. 前言 最近在写第三方工具的时候&#xff0c;需要判断使用方项目具体使用了什么数据库类型&#xff0c;从而进行不一样的实现逻辑。当然可以让用户在YML中配置说明项目用什么数据库&#xff0c;但用户不一定填写正确。因此需要想其他…

appium+python自动化测试

获取APP的包名 1、aapt即Android Asset Packaging Tool&#xff0c;在SDK的build-tools目录下。该工具可以查看apk包名和launcherActivity 2、在android-sdk里面双击SDK-manager,下载buidl-tools 3、勾选build-tools&#xff0c;随便选一个版本&#xff0c;我这里选的是24的版…

工控流量分析题+wireshark学习

写在前面 暑假报名了工控比赛 所以要找些工控的题目来刷刷 正好比赛方提供的靶场有很多类似的题目 开始痛苦的学习过程。。。 Wireshark Capture filter <Protocol name> <Direction><Host(s)><Value><Logical operations><Expression>…

bootstrap富文本编辑器的使用

bootstrap-wysiwyg是一款轻量级的富文本编辑插件&#xff0c;大致长这样 在此记录一下我使用它踩过的坑和经验。 插件的引入 插件其实分为两部分&#xff1a;顶部的一系列编辑按钮和下方的div编辑框 前台代码如下&#xff1a; <div style"height: 50px;">&…

用C#语言实现记事本

C#实现记事本 一、记事本界面设计 1、打开VS2013 单击 文件→新建→项目 2、选择模版→Visual C#→windows→windows窗体应用程序&#xff0c;在下面的名称写Notepad 3、更改窗体名称&#xff0c;单击窗体→右下角属性→text&#xff0c;修改为“记事本” 补充&#xff1a…

pixhawk计算机无法识别,PIXHAWK教程 3.1.2 连接你的遥控输入和电机(Pixhawk)

连接你的遥控输入和电机(Pixhawk) 目录 连接你的遥控输入和电机(Pixhawk) 连接蜂鸣器和安全开关 连接其他外部设备 连接遥控输入 连接电机输入 安装螺旋桨 顺时针和逆时针桨的识别 连接蜂鸣器和安全开关 蜂鸣器和安全开关依附于Pixhawk。 分别连接到蜂鸣器和开关端口。 连接其他…

ThinkPHP 验证码扩展库的使用,以及多应用模式下,如何自定义验证码校验规则

ThinkPHP 验证码扩展库的使用&#xff0c;以及多应用模式下&#xff0c;如何自定义验证码校验规则 一、安装二、页面使用三、验证码相关配置属性1. 自定义验证码配置2. 自定义验证码&#xff08;一&#xff09;普通验证码3. 自定义验证码&#xff08;二&#xff09;算数验证码4…

linux会话session

linux会话 什么是linux session 我们常见的 Linux session 一般是指 shell session。Shell session 是终端中当前的状态&#xff0c;在终端中只能有一个 session。 当我们打开一个新的终端时&#xff0c;总会创建一个新的 shell session。这表明会话是我们和shell交互的一个过…

session是什么

前言&#xff1a; 今天就来彻底的学一些session是个啥东西&#xff0c;我罗列了几个需要知道的要点&#xff1a; 1.session 是啥&#xff1f; 2.怎么保存的&#xff1f; 3.如何运行&#xff1f; 4.有生命周期吗&#xff1f; 5.关闭浏览器会过期吗&#xff1f; 6.Redis代替文件存…

Session是什么东西

虽然经常做的C,Web 写的少&#xff0c;但是这个知识在面试中经常遇到&#xff0c;现在就记录一下。 Web的三个概念&#xff1a; Session 、 cookie、 application。 Session 和 Cookie 功能效果是差不多的&#xff0c;区别就是session 是记录在服务端的&#xff0c;Cookie是记…

Python—Session

python中session()是干什么作用的_session是什么意思 Session&#xff1a;在计算机中&#xff0c;尤其是在网络应用中&#xff0c;称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样&#xff0c;当用户在应用程序的 Web 页之间跳转时&#xff0c;存储…

彻底弄清楚session是什么?

前言&#xff1a; 今天就来彻底的学一些session是个啥东西&#xff0c;我罗列了几个需要知道的要点&#xff1a; 1.session 是啥&#xff1f; 2.怎么保存的&#xff1f; 3.如何运行&#xff1f; 4.有生命周期吗&#xff1f; 5.关闭浏览器会过期吗&#xff1f; 6.redis代替文…

浅谈 Cookie 和 Session

理解Cookie理解Session核心方法案例-网页登录1. 编写一个简单的登录页面2. 编写一个 Servlet 来处理这个登录请求3. 编写服务器返回主页的逻辑4. 启动服务器验证 Cookie 和 Session 区别 理解Cookie 在前面的 HTTP 协议中,也理解过这个 Cookie,HTTP 协议自身是属于 “无状态”…

session是什么?

目录&#xff1a; 1.session 是啥&#xff1f; 2.怎么保存的&#xff1f; 3.如何运行&#xff1f; 4.有生命周期吗&#xff1f; 5.关闭浏览器会过期吗&#xff1f; 6.Redis代替文件存储session 7.分布式session的同步问题 session是啥&#xff1f; 首先&#xff0c;我大致的…

什么是session?

最近在学习node.js 的express框架&#xff0c;接触到了关于session方面的内容。翻阅了一些的博客&#xff0c;学到了不少东西&#xff0c;发现一篇博文讲的很好&#xff0c;概念内容摘抄如下&#xff1a; Session是什么 Session一般译作会话&#xff0c;牛津词典对其的解释是…

session的到底是做什么的?

前言&#xff1a; 今天就来彻底的学一些session是个啥东西&#xff0c;我罗列了几个需要知道的要点&#xff1a; 1.session 是啥&#xff1f; 2.怎么保存的&#xff1f; 3.如何运行&#xff1f; 4.有生命周期吗&#xff1f; 5.关闭浏览器会过期吗&#xff1f; 6.Redis代替文…

Session(超详细)

Session 会话 1.什么是 Session 会话? Session 就一个接口&#xff08;HttpSession&#xff09;。Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。每个客户端都有自己的一个 Session 会话。Session 会话中&#xff0c;我们经常用来保存用户登录之后的…

Session详解(重点)

什么是Session: &#xff08;1&#xff09;服务器会给每一个用户&#xff08;浏览器&#xff09;创建一个Session对象 比如我们现在都去访问百度&#xff0c;我们使用双核浏览器和谷歌浏览器同时访问百度这个网址&#xff0c;百度那边会有两个session,因为浏览器不一样&#x…