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

本文介绍了Java中线程间通信的基本概念和方法,包括使用wait()、notify()进行线程同步,以及在多线程环境下如何通过ReentrantLock的Condition对象实现更细粒度的控制。此外,还探讨了线程组的创建与使用,展示了如何设置线程所属的线程组,并调整线程为后台线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信公众号: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() 通过线程对象获取他所属于的组

    • public final String getName() 通过线程组对象获取他组的名字

    • Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,java允许程序直接对线程组进行控制

    • 默认情况下,所有的线程都属于主线程组

    • 我们也可以给线程设置分组

    • 演示

资料 · 福利

回复 【Java】即可获取最新零基础Java视频资料

回复 【激活】即可获取IDEA、datagrip等系统激活方式

回复 【面试题】即可获取Java技术相关面试题

往期 · 精彩

专注分享Java技术,跟我一起学习吧

长按识别二维码关注

d625c0f110df68f4945f46af0a57af01.png

99432dbf76076215aeed9784dde9e873.jpeg

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值