1.线程通信
生产者—>数据缓存—>消费者
这是要给线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者相互依赖,互为条件
在生产者消费者问题中,仅有synchronized是不够的
synchronized可阻止并发更新同一个共享资源,实现了同步
synchronized不能用来实现不同线程之间的消息传递(通信)
Java提供了几个方法解决线程之间的通信问题:
- wait()--------表示线程一直等待,直到其他线程来通知,与sleep不同,会释放锁
- wait(long timeout)--------等待的毫秒数
- notify()---------唤醒一个处于等待状态的线程
- notifyAll()----------唤醒同一个对象上所有调用wait方法的线程,优先级高的线程优先调度
方法一:
并发协作模型车“生产者/消费者模式”—->管线法
生产者:负责生产数据模块(可能是方法,对象,线程,进程)
消费者:负责处理数据模块(可能是方法,对象,线程,进程)
缓冲区:消费者不能直接使用生产者的数据,他们之间有个缓冲区
生产者将生产好的数据放入缓冲区,消费者冲缓冲区拿出数据
前后台生产炸鸡例子
执行结果:
方法二:
并发协作模型“生产者/消费者模式”——>信号灯法
定义一个boolea类型数据,用作标识,判断完以后反过来,用其判断什么时候等待、监听和唤醒
执行结果:
2.线程池
- 背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。
- 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中,可以避免频繁创建销毁、实现充分利用。类似生活中的公共交通工具。
- 优点:
提高相应速度(减少了创建新线程的时间)
降低资源消耗(重复利用线程池中的线程,不需要每次都创建)
便于线程管理
执行结果:
PS:完结散花!!!