首页 > 其他分享 >线程等待通知机制

线程等待通知机制

时间:2024-04-06 16:00:17浏览次数:22  
标签:通知 t2 t1 线程 new 执行 等待 wait

join()是等待线程结束。
wait是等待线程通知,并不一定是执行结束。能更加精细的控制线程执行的顺序。

在什么情况下使用线程等待通知呢?

“线程饿死问题”,一个线程频繁的获取锁和释放锁,由于获取锁的速度太快,其他的线程抢不到,那么就会影响到代码的执行速度。

而等待通知机制就能够解决上述问题:

通过条件判定当前逻辑是否能执行,如果不能执行就主动wait,把执行机会留给其他线程。等到时机成熟后,再由其他线程进行唤醒,进行线程的抢占执行

注意:1.wait是Object类提供的方法,任何对象都可以使用这个方法。
2.wait内部做的不仅仅是阻塞等待,还有解锁,那就是说先有锁才能谈释放,wait必须放到synchronized内部使用

public class demo2 {
    public static void main(String[] args) throws InterruptedException {
        Object locker=new Object();
        Thread t1=new Thread(()->{
           synchronized (locker){
               System.out.println("t1等待之前");
               try {
                   locker.wait();
               } catch (InterruptedException e) {
                   throw new RuntimeException(e);
               }
               System.out.println("t1等待之后");
           }
        });
        Thread t2=new Thread(()->{
            Scanner scanner=new Scanner(System.in);
            synchronized (locker){
                System.out.print("请输入一个数字:");
                scanner.next();
                locker.notify();
            }

        });
        t1.start();
        t2.start();
    }
}

在上述代码中,由于t2线程需要打开输入资源流,所以t1大概率比t2先拿到锁,当t1拿到锁后t1执行wait,t1线程释放锁,然后执行t2线程。等到t2线程来唤醒t1线程的时候,线程t1进入就绪状态,当t2释放锁后,拿到锁继续执行。但是当t2线程先执行那么notify无效。t1线程不能被唤醒执行

标签:通知,t2,t1,线程,new,执行,等待,wait
From: https://blog.csdn.net/2301_78864183/article/details/137428795

相关文章

  • 理解进程和线程
    一.进程和线程进程和线程的存在目的都是为了实现并发执行,提高系统的资源利用率和响应速度。进程概念:​ 自己话理解,进程就是,一个程序,当操作系统执行时,让他成为了一个动起来的实体,此时这个活动的实体就是进程。进程是程序执行时的一个实例。每个进程都有自己的地址空间、内......
  • 并发编程(二):线程安全检查工具
    对于验证代码是否是线程安全,往往是十分困难的,有一些工具可以帮我们简化这项任务,以尽可能保证并发的正确性。ThreadSanitizer谷歌出品,内置于编译器的一种线程安全分析工具,使用方法就是在编译时加上-fsanitize=thread配置项即可。现在来简单尝试分析如下代码:#include<th......
  • 多线程(33)ConcurrentHashMap
    ConcurrentHashMap是Java并发包中提供的一个线程安全的哈希表实现。与传统的同步容器相比,ConcurrentHashMap通过一种分段锁的机制实现了更高的并发度。本节将深入探讨其设计原理,结合源码进行分析,并通过代码示例来演示其使用方法。设计原理ConcurrentHashMap的设计理......
  • 多线程(34)CopyOnWriteArrayList
    CopyOnWriteArrayList是Java中一个线程安全的ArrayList变体,属于java.util.concurrent包。它通过在所有修改操作(如add,set等)上执行显式复制来实现线程安全。这种设计适用于列表读操作的数量远远大于写操作的场景。设计原理CopyOnWriteArrayList的基本思想是,每当......
  • C#-多线程
    线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。线程是**轻量级进程**。一个使用线程的常见实例是现代操作系统中并行编程的实现。使用线程节省了C......
  • 【Java EE】多线程(一)
    ......
  • easyExcel通用导出(非注解,多线程)
    1、基础类描述ExcelWriter(导出工具类)Query(通用查询)Consumer(函数参数)SpringBeanUtil(获取bean)2、代码ExcelWriterimportcn.hutool.core.collection.CollUtil;importcn.hutool.core.collection.ListUtil;importcn.hutool.core.util.PageUtil;importcn.hutool.core.u......
  • 在Python中用concurrent.futures创建线程池进程池
    简介Python3.2带来了concurrent.futures模块,借此能够快速使用线程池和进程池。对于不需要控制优先级与资源分配的多任务,使用concurrent.futures模块快捷优雅。示例代码与效果importconcurrent.futuresimporttimedefa_task(x):"""模拟一个耗时的任务"""de......
  • 【系统深入学习GO】Go 的并发机制-原理探究 线程实现模型
    在操作系统提供的内核线程之上,Go搭建了一个特有的两级线程模型。*两级线程模型:两级线程模型也称为多对多(M:N)的线程实现。与其他模型相比,两级线程模型提供了更求的灵活性。在此模型下,一个进程可以与多个KSE相关联,这与内核级线程模型相似。但与内核级线程模型不同的是,进程......
  • Python线程池的概念涉及创建一个线程集合(即线程池)
    Python线程池的概念涉及创建一个线程集合(即线程池),这些线程预先被初始化并保存在内存中,等待任务的分配和执行。使用线程池可以有效地管理和复用线程资源,提高程序的执行效率。以下是Python线程池相关的概念及其示例程序:1.线程池(ThreadPool)线程池是一个管理线程的集合,它负责线......