多线程之间通讯

  • 多线程之间如何实现通讯?
  • 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

如何停止线程?

停止线程思路

  1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
  2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。
  3. 使用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 多线程之间通讯(面试概念解答三)相关推荐

  1. JAVA多线程和并发面试问题

    转载自   JAVA多线程和并发面试问题 Java多线程面试问题 1.进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程 ...

  2. Java 多线程线程安全(面试概念解答二)

    Java 多线程线程安全 什么是线程安全? 为什么有线程安全问题? 线程安全解决办法? 同步代码块 同步函数 静态同步函数 多线程死锁 多线程的三大特性 原子性 可见性 有序性 Java内存模型 Vo ...

  3. Java 多线程快速入门(面试概念解答一)

    Java 多线程快速入门 什么是进程,什么是线程,什么是多线程? 创建多线程有哪些方式? 启动线程是使用调用start方法还是run方法? 获取线程对象以及名称 守护线程 使用setDaemon(tr ...

  4. java 多线程间通讯_JAVA多线程间通讯常用实现方法解析

    如何实现线程间通讯,有如下三种方法: 1.使用Semaphore (信号量)类来控制线程的等待和释放 功能:三个线程 a .b .c 并发运行,b,c 需要 a 线程的数据怎么实现 分析:考虑到多线程 ...

  5. java多线程编程01---------基本概念

    一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...

  6. java 多线程 并发 面试题_最常见的15个Java多线程,并发面试问题

    假设你有三个线程T1,T2,T3.你如何能保证线程T2在线程T1后运行,T3在T2后运行 这个线程面试问题大多是在第一轮或电话筛选轮次中会被问到的,这个多线程问题的目的是检查候选人对"joi ...

  7. java多线程中 锁 的概念的理解,java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)...

    目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...

  8. Java 多线程 | 并发知识面试问答总结

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  9. java多线程心法(基础概念)

    基本概念 (以下任务可以理解为 java 的方法) 1.1:程序.进程.线程 程序:用某种语言编写的一组指令的集合,一段静态代码进程:使程序的静态代码运行起来,比如正在运行的微信,就是一个进程,进程是 ...

最新文章

  1. 所有的中台都是业务中台
  2. 每天一道LeetCode-----给定字符串s和字符数组words,在s中找到words出现的位置,words内部字符串顺序无要求
  3. 多行字符串的表示方式
  4. linux ftp安装_Linux 文件共享方案
  5. tomcat7的安装与maven安装
  6. c语言switch编写个人所得税,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
  7. 根据主题不同,引用不同的资源文件
  8. 如何理解t检验、t分布、t值?
  9. 华为销售专家LTC专家许浩明老师:流程是数字化转型的基础,以华为营销LTC,华为铁三角为例
  10. 用python结合matplotlib包,绘制带有误差棒和数值的柱状图,每根柱子配色不同
  11. 免费WiFi上网软件是什么?怎么用?
  12. 一分钟带你解读收发器指示灯以及SFP光模块搭配(二)
  13. 腾讯视频投屏显示无法连接服务器,腾讯视频突然不能投屏怎么办 投屏连接失败解决方法...
  14. 原神手游怎么用电脑玩 原神模拟器玩法教程
  15. html如何实现日期下拉菜单,实现一个日期下拉菜单
  16. 2022.10.10 英语背诵
  17. C-kermit使用
  18. 纬地道路纵断面设计教程_纬地公路设计详细步骤(精)
  19. ZigBee网络信标(Beacon)和非信标(Non-beacon)两种工作模式
  20. 【原创】如何判断Win10计算机的硬盘是HHD还是SSD

热门文章

  1. 关于香港DHL与大陆DHL有什么不同?
  2. VM虚拟机故障安装不了虚拟网卡解决办法
  3. 显存不足问题(OOM、RuntimeError: CUDA out of memory)
  4. 在centeros搭建workpress
  5. 软件测试是干什么的 通过各种方式检查软件的质量问题
  6. Google Android Developer
  7. 【深度学习】村通网之——谈谈Tensorflow Eager Execution机制之静态图和动态图的区别(一)
  8. 以核心技术提升打破认知偏见:破解第三代哈弗H6的技术密码
  9. 上海-亚马逊AWS联合创新中心正式启用
  10. Javascript 从ES5到ES7 - 14 类型运算