首页 > 其他分享 >一次有趣的多线程调度问题

一次有趣的多线程调度问题

时间:2022-08-29 17:35:40浏览次数:62  
标签:Object pid 调度 System 线程 notify urlId 有趣 多线程

线程1----wait()

1 Object o=new Object();
2 waitAndNotifyMap.put(urlId,o);
3 System.out.println(urlId+"运行到阻塞");
4 synchronized (o){
5     o.wait(1000);
6 }

线程2----notify()

 1 if(waitAndNotifyMap.get(pid)==null) {
 2     //如果待唤醒的父线程的锁对象还没有加入map就先睡0.5s
 3     System.out.println(urlId+"父锁"+pid+"还未设置,等待");                    
 4     TimeUnit.MILLISECONDS.sleep(500);
 5 }
 6 Object o=waitAndNotifyMap.get(pid);
 7 synchronized (o){
 8     System.out.println(urlId+"唤醒"+pid);
 9     o.notify();
10 }

问题:

线程1运行到第3行,线程2运行到了第7行,此时Object已经被创建到map中,但是线程1还没有wait(),如果CPU时间继续分配给线程2,就会提前notify(),导致线程1超时等待1s后再执行,而不是被通知执行

 

标签:Object,pid,调度,System,线程,notify,urlId,有趣,多线程
From: https://www.cnblogs.com/JNU-Iot-Longxin/p/16636679.html

相关文章

  • C++【多线程编程】之【线程安全】
    1.线程安全是什么?在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。2.什么情况......
  • k8s之 pod调度
    案例:确保Pod分配到具有SSD硬盘的节点上第一步:给节点添加标签格式:kubectllabelnodes<node-name><label-key>=<label-value>例如:kubectllabelnodesk8s-node1dis......
  • C++【多线程编程】之【初识线程创建】
    1.线程创建函数调用pthread_create(句柄、参数、函数入口,函数入口的实参)intpthread_create(....)cppthread类:thread类的创建方法比较简便。但也有很多问题需要考虑......
  • 多线程
    原子性:一个操作或多个操作要么全部执行,且执行过程不会被任何因素打断,包括其他线程,要么全部不执行   每个线程都有自己独立的工作内存,从主内存中copy内容保存在工作......
  • java使用多种方式实现多线程及线程池的使用
    ​ 一、多线程实现了什么?为了解决负载均衡问题,充分利用CPU资源.为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而不互相干扰.为了处理大量的IO操作时或处理......
  • java多线程2
    我们知道,线程有五种生命周期:新建,就绪,运行,阻塞,死亡.在我们编写,运行代码的过程中,可能出现线程死锁,线程阻塞等问题,下面介绍线程产生这些问题的原因,及解决的方案,......
  • python中的多线程与多进程
    线程概念:线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的......
  • C++【多线程编程】之【初识线程】
    1.用c++11的thread库还是用pthread库?至于选择哪种多线程编程方案,需要根据你的实际项目、运行平台、团队协作等因素来考虑。一般而言,如果使用的是Linux操作系统,那么可以......
  • 【c++多线程】互斥量概念、用法、死锁演示以及unique_lock
    第5节互斥量概念、用法、死锁演示及解决详解(1)互斥量(mutex)的基本概念(2)互斥量的用法(2.1)lock(),unlock()(2.2)std::lock_guard类模板(3)死锁(3.1)......
  • UnixBench跑分没有多线程数据的解决办法
    如图,只显示了单核的结果就退出了跑分第一种解决办法是找到UnixBench文件夹下的Run文件,编辑第110行的核数进行修改为自己的服务器核数然后再执行./Run  第二种办法如......