线程
进程(正在执行的程序,宏观)包括(一个或多个)线程(微观)
线程的意义并不是制造了多个CPU,而是利用了CPU的空闲时间
1. 继承thread(不需要导包),重写run方法/实现runnable
2.主函数调用线程类的start方法,而非run方法
thread(实现runnable接口的类作为参数).start(),或,继承thread重写run方法的类的实例名.Start()
3.repaint 方法,paint 方法,使用线程可以实现定时重绘
4.join
在b的run方法中写a.join那么不管a是否在b之前start,或是休眠多久,a都会先于b执行(整个run方法,有多少次就多少次,执行完才轮到b)
5. notify 和wait都一定要在synchronized(同步锁)里面,
关于同步锁:同步锁中的代码并不是只有一个对象可以执行,而是它锁住的对象只有一个对象可以进行修改
6.继承了Thread就拥有了属性name及其set、get方法
7. 生产者-消费者问题
用同步锁两个生产者一个消费者(都休眠100ms)为什么不报错而是停了?
三个都处于等待,生产者1生产完时消费者正在休眠,wait列表中只有另一个生产者,无法notify到消费者,生产者2收到notify却因为生产者1已足够生产苹果而不进行动作,这样,当消费者休眠完虽然有苹果却因为没人notify一直处于wait状态,两个生产者也因为消费者没有消费没人notify,这就造成了不报错却僵持的局面。
改消费者休眠时间为10ms后不停止了,是因为供需平衡了吗?
修改后生产者notify到生产者的概率将大大减小(不是不存在),所以从宏观上看,这个问题被解决了
总结:都在等待是安全的,都在休眠却是危险的
如果一个对象发出了notify指令,wait队列为空会怎样?