多线程 | 线程通信

1. while实现线程通信

//线程二需要while轮询 才能实现线程间通信,对cup消耗很大
//线程主动读取 而非对象等待/通知

        fun main(args: Array<String>) {
            val goods = Goods()
            Thread(Runnable { goods.deduction(); Thread.sleep(300); goods.deduction(); }).start()
            Thread(Runnable {
                do {
                    Thread.sleep(200)
                } while (goods.stock > 3)
                println("商品库存减少到小于4")
            }).start()
        }

2. wait和Notify

  • 谁wait对谁上锁. 在调用wait()和notify()之前,线程必须获得该对象的对象级别锁,即只能在(该对象的)同步方法或同步代码块(该对象)中调用wait方法。
  • 每个对象的notify()只能唤醒一个wait().如果存在同一对象的多个wait()线程,则随机唤醒一个
  • wait()触发后,wait线程被挂起,等到该对象notify()方法触发,wait线程回到可运行状态,与其他线程公平竞争。notify()方法触发后,必须等到对象级别锁释放,也就是sychronized(obj)代码块执行完毕 ,wait线程才能被唤醒.
  • wait()触发,wait线程放弃对象锁并挂起该线程。
class WaN{
    private val lock = java.lang.Object()
    private val goods =Goods()
    fun dec(){
        synchronized(lock){
            for (i in 1..3) {
                goods.deduction()
            }
            lock.wait()
            //notify触发以后,线程被唤醒,但wait线程仍然要与其他线程公平竞争
            Thread.sleep(200)
            println("wait结束...")
        }
    }
    fun dis(){
        synchronized(lock){
            lock.notify()
            Thread.sleep(500)
            goods.discount()
//wait的对象级别锁 的notify执行到这里才算结束,也就是说,必须使wait的对象级别锁释放,wait线程才能从挂起状态被唤醒,
//而不是lock.notify行代码执行后,就立即唤醒wait线程
        }
    }
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val WaN = WaN()
            Thread(Runnable { WaN.dec() }).start()
            Thread(Runnable { WaN.dec() }).start()
            Thread.sleep(2000)
            Thread(Runnable { WaN.dis() }).start()
        }
    }
}

3. 线程状态切换

线程切换示意图
  • 线程start()方法执行后,系统会为cpu分配资源,使其处于Runnable状态,这 是一个准备运行阶段,抢到cpu就是Running状态。
  • 从Running 到Runnable

每个锁对象都有两个队列:一个是就绪队列,一个是阻塞队列。就绪队列了将要获得锁的线程,阻塞队列存储了被阻塞的线程。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 13,900评论 4 56
  • 【JAVA 线程】 线程 进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者...
    Rtia阅读 7,773评论 2 20
  • 书剑派的一天(上) 一到山门,嚯,那阵势可是不得了了。(接上文) 虎灵山之外,人山人海之上,人山人海。 这话...
    窗台外阅读 3,633评论 41 20
  • 总是寂寞, 没有人聊天。 应是长久的孤独, 尽管难以忍受。 亦如天空中静默的星, 从未有人见过它们言语。 据说它们...
    古风长歌阅读 1,675评论 0 3
  • 每天一本书,day 29,45/400,这种多少天能干什么事的书,基本都是标题党,这本也不例外。不过此书的内容还是...
    洋星阅读 2,833评论 0 0

友情链接更多精彩内容