专栏首页Java患者Java基础知识(十二)--多线程通信

Java基础知识(十二)--多线程通信

两个线程间的通信

什么时候需要通信

  • 多个线程并发执行时,在默认情况下CPU是随机切换线程的
  • 如果我们希望他们有规律的执行.就可以使用通信,例如每个线程执行一次打印

怎么通信

  • 如果希望线程等待,就调用wait()
  • 如果希望唤醒等待的线程,就调用notify()
  • 这两个方法必须在同步代码中执行,并且使用同步锁对象来调用

三个或者三个以上间的线程通信

  • notify()是随机唤醒一个线程
  • notifyAll()方法是唤醒所有线程
  • jdk5之前无法唤醒指定的一个线程
  • 如果多个线程之间通信,需要使用notifyAll()通知所有线程,用while来反复判断条件

同步

  • 使用ReentrantLock类的lock()和unlock方法进行同步

通信

  • 使用ReentrantLock类的newCondition()方法可以获取Condition对象
  • 需要等待的时候使用Condition的await()方法,唤醒的时候用signal()方法
  • 不同的线程使用不同的Condition,这样就能区分唤醒的时候找哪个线程了

线程组

概述

MyRunnable mr = new MyRunnable();
Thread t1 = new Thread(mr, "张三");
Thread t2 = new Thread(mr, "李四");
//获取线程组
// 线程类里面的方法:public final ThreadGroup getThreadGroup()
ThreadGroup tg1 = t1.getThreadGroup();
ThreadGroup tg2 = t2.getThreadGroup();
// 线程组里面的方法:public final String getName()
String name1 = tg1.getName();
String name2 = tg2.getName();
System.out.println(name1);
System.out.println(name2);
// 通过结果我们知道了:线程默认情况下属于main线程组
// 通过下面的测试,你应该能够看到,默任情况下,所有的线程都属于同一个组
System.out.println(Thread.currentThread().getThreadGroup().getName());
// ThreadGroup(String name)
ThreadGroup tg = new ThreadGroup("这是一个新的组");

MyRunnable mr = new MyRunnable();
// Thread(ThreadGroup group, Runnable target, String name)
Thread t1 = new Thread(tg, mr, "张三");
Thread t2 = new Thread(tg, mr, "李四");

System.out.println(t1.getThreadGroup().getName());
System.out.println(t2.getThreadGroup().getName());

//通过组名称设置后台线程,表示该组的线程都是后台线程
tg.setDaemon(true);
  • 自己设定线程组
  • ThreadGroup(String name) 创建线程组对象并给其赋值名字
  • Thread(ThreadGroup group, Runnable target, String name)
  • public final ThreadGroup getThreadGroup() 通过线程对象获取他所属于的组
  • Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,java允许程序直接对线程组进行控制
  • 我们也可以给线程设置分组

本文分享自微信公众号 - Java患者(gh_3a16ffdedb6a),作者:Zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java基础知识(十)--多线程

    用户7386338
  • Java基础知识(十一)--多线程

    用户7386338
  • Java多线程通关———基础知识

    1 线程:进程中负责程序执行的执行单元 线程本身依靠程序进行运行 线程是程序中的顺序控制流,只能使用分配给程序的资源和环境

    后端码匠
  • Java基础知识(十三)--线程池

    用户7386338
  • JAVA多线程并发的基础知识

    并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写...

    用户5640963
  • Java基础-多线程(二)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    cwl_java
  • java基础(十一):多线程

    注意:优先级低只是意味着获得调度的概率低。并不是绝对先调用优先级高后调用优先级低的线程。

    Vincent-yuan
  • 【多线程】基础理论知识

    上一个系列是SpringCloud入门系列,以后肯定会写一期进阶系列,但是目前更新的是多线程系列。

    用户8902830
  • Java多线程学习(五)线程间通信知识点补充

    我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailc...

    用户2164320
  • 学习Java基础知识,打通面试关~十五线程池学习

    用户2196435
  • Java多线程知识小抄集(二)

    27. ConcurrentHashMap ConcurrentHashMap是线程安全的HashMap,内部采用分段锁来实现,默认初始容量为16,装载因子为0...

    用户1263954
  • 【趣学程序】java基础知识(二)

    趣学程序-shaofeer
  • 学习Java基础知识,打通面试关~十六自定义线程池

    用户2196435
  • 【Java基本功】一文了解Java多线程的基础知识点

    本文介绍了Java多线程的基本概念,使用方法,以及底层实现原理。帮助你更好地使用Java的多线程。

    Java技术江湖
  • 多线程基础知识了解一下

    作为一名优秀的攻城师,了解多线程的知识非常有必要,尤其在人工智能和机器学习的热潮下,如何提高程序或者算法的运行效率是非常有价值的一件事情。

    我是攻城师
  • 多线程基础知识了解一下

    作为一名优秀的攻城师,了解多线程的知识非常有必要,尤其在人工智能和机器学习的热潮下,如何提高程序或者算法的运行效率是非常有价值的一件事情。

    我是攻城师
  • Java程序员必备基础:Object的十二个知识点

    构造方法是每一个类独有的,并不能被子类继承,因为构造方法没有返回值,子类定义不了和父类的构造方法一样的方法。但是在同一个类中,构造方法可以重载

    捡田螺的小男孩
  • Java知识点——线程通信(线程之间的联系)

    现在存在两个完全无关的线程:生产者和消费者,但是商品会作为他们两者之间的共享资源。 生产者和消费者中都有一个成员变量 商品类型

    用户7073689
  • 多线程基础(十三):java中的FutureTask

    可以看到,FutrueTask实现了RunnableFuture接口,而RunnableFuture接口又继承了Future和Runnable。如下图:

    冬天里的懒猫

扫码关注云+社区

领取腾讯云代金券