Java 多线程之间通讯(面试概念解答三)
多线程之间通讯
- 多线程之间如何实现通讯?
- wait()、notify、notifyAll()方法
- wait与sleep区别?
- JDK1.5-Lock
- Lock 接口与 synchronized 关键字的区别
- Condition用法
- 如何停止线程?
- ThreadLoca
- 什么是ThreadLoca?
- ThreadLoca实现原理
多线程之间如何实现通讯?
多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。
wait()、notify、notifyAll()方法
wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。
这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。
如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。
如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行。
如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。
注意:一定要在线程同步中使用,并且是同一个锁的资源
wait与sleep区别?
对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
JDK1.5-Lock
在 jdk1.5 之后,并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能,Lock 接口提供了与 synchronized 关键字类似的同步功能,但需要在使用时手动获取锁和释放锁。
Lock写法
Lock lock = new ReentrantLock();
lock.lock();
try{//可能会出现线程安全的操作
}finally{//一定在finally中释放锁
//也不能把获取锁在try中进行,因为有可能在获取锁的时候抛出异常lock.ublock();
}
Lock 接口与 synchronized 关键字的区别
Lock 接口可以尝试非阻塞地获取锁 当前线程尝试获取锁。如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁。
Lock 接口能被中断地获取锁 与 synchronized 不同,获取到锁的线程能够响应中断,当获取到的锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。
Lock 接口在指定的截止时间之前获取锁,如果截止时间到了依旧无法获取锁,则返回。
Condition用法
Condition的功能类似于在传统的线程技术中的,Object.wait()和Object.notify()的功能。
代码
Condition condition = lock.newCondition();
res.condition.await(); // 类似wait
res.Condition. Signal() // 类似notify
如何停止线程?
停止线程思路
- 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
- 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。
- 使用interrupt方法中断线程。
class StopThread implements Runnable {private boolean flag = true;@Overridepublic synchronized void run() {while (flag) {try {wait();} catch (Exception e) {//e.printStackTrace();stopThread();}System.out.println("thread run..");}}public void stopThread() {flag = false;}
}public class StopThreadDemo {public static void main(String[] args) {StopThread stopThread1 = new StopThread();Thread thread1 = new Thread(stopThread1);Thread thread2 = new Thread(stopThread1);thread1.start();thread2.start();int i = 0;while (true) {System.out.println("thread main..");if (i == 300) {// stopThread1.stopThread();thread1.interrupt();thread2.interrupt();break;}i++;}}}
ThreadLoca
什么是ThreadLoca?
ThreadLocal提高一个线程的局部变量,访问某个线程拥有自己局部变量。
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
ThreadLocal的接口方法
ThreadLocal类接口很简单,只有4个方法,我们先来了解一下:
- void set(Object value)设置当前线程的线程局部变量的值。
- public Object get()该方法返回当前线程所对应的线程局部变量。
- public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
- protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。
ThreadLoca实现原理
ThreadLoca通过map集合实现
Map.put(“当前线程”,值);
Java 多线程之间通讯(面试概念解答三)相关推荐
- JAVA多线程和并发面试问题
转载自 JAVA多线程和并发面试问题 Java多线程面试问题 1.进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程 ...
- Java 多线程线程安全(面试概念解答二)
Java 多线程线程安全 什么是线程安全? 为什么有线程安全问题? 线程安全解决办法? 同步代码块 同步函数 静态同步函数 多线程死锁 多线程的三大特性 原子性 可见性 有序性 Java内存模型 Vo ...
- Java 多线程快速入门(面试概念解答一)
Java 多线程快速入门 什么是进程,什么是线程,什么是多线程? 创建多线程有哪些方式? 启动线程是使用调用start方法还是run方法? 获取线程对象以及名称 守护线程 使用setDaemon(tr ...
- java 多线程间通讯_JAVA多线程间通讯常用实现方法解析
如何实现线程间通讯,有如下三种方法: 1.使用Semaphore (信号量)类来控制线程的等待和释放 功能:三个线程 a .b .c 并发运行,b,c 需要 a 线程的数据怎么实现 分析:考虑到多线程 ...
- java多线程编程01---------基本概念
一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...
- java 多线程 并发 面试题_最常见的15个Java多线程,并发面试问题
假设你有三个线程T1,T2,T3.你如何能保证线程T2在线程T1后运行,T3在T2后运行 这个线程面试问题大多是在第一轮或电话筛选轮次中会被问到的,这个多线程问题的目的是检查候选人对"joi ...
- java多线程中 锁 的概念的理解,java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)...
目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...
- Java 多线程 | 并发知识面试问答总结
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
- java多线程心法(基础概念)
基本概念 (以下任务可以理解为 java 的方法) 1.1:程序.进程.线程 程序:用某种语言编写的一组指令的集合,一段静态代码进程:使程序的静态代码运行起来,比如正在运行的微信,就是一个进程,进程是 ...
最新文章
- 所有的中台都是业务中台
- 每天一道LeetCode-----给定字符串s和字符数组words,在s中找到words出现的位置,words内部字符串顺序无要求
- 多行字符串的表示方式
- linux ftp安装_Linux 文件共享方案
- tomcat7的安装与maven安装
- c语言switch编写个人所得税,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
- 根据主题不同,引用不同的资源文件
- 如何理解t检验、t分布、t值?
- 华为销售专家LTC专家许浩明老师:流程是数字化转型的基础,以华为营销LTC,华为铁三角为例
- 用python结合matplotlib包,绘制带有误差棒和数值的柱状图,每根柱子配色不同
- 免费WiFi上网软件是什么?怎么用?
- 一分钟带你解读收发器指示灯以及SFP光模块搭配(二)
- 腾讯视频投屏显示无法连接服务器,腾讯视频突然不能投屏怎么办 投屏连接失败解决方法...
- 原神手游怎么用电脑玩 原神模拟器玩法教程
- html如何实现日期下拉菜单,实现一个日期下拉菜单
- 2022.10.10 英语背诵
- C-kermit使用
- 纬地道路纵断面设计教程_纬地公路设计详细步骤(精)
- ZigBee网络信标(Beacon)和非信标(Non-beacon)两种工作模式
- 【原创】如何判断Win10计算机的硬盘是HHD还是SSD