【Java】【线程同步】sleep,join,yield,synchronized,wait,notify

线程状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态
阻塞状态:根据引发阻塞的原因,又可分为等待阻塞,同步阻塞等

new Thread():新建状态
Thread.start():新建状态 -> 就绪状态
Thread.run():就绪状态 -> 运行状态(当系统调度分配CPU资源时,才会进入运行状态)
run()执行完毕:运行状态 -> 死亡状态
Thread.sleep():运行状态 -> 阻塞状态
Thread.sleep()执行完毕:阻塞状态 -> 就绪状态 -> 运行状态(当系统调度分配CPU资源时,才会进入运行状态)
Thread.join():运行状态 -> 阻塞状态
Thread.yield():运行状态 -> 就绪状态
synchronized失败:运行状态 -> 阻塞状态

Thread.sleep():等待一段时间,进入就绪状态,如果有CPU资源可以调度,则接着进入运行状态
Thread.join():等待一个线程执行完,再继续当前线程,比如t2里面执行了t1.join(),则t1执行完,t2才会继续
Thread.join(time):最多等待一段时间,超过这段时间则并发执行,time=0等同于无参,无限等待直到t1结束
Thread.yield():让一个线程进入就绪状态,让系统去调度接下来哪个线程获得资源

synchronized:当一个方法/对象前带有synchronized,表示对这个对象加锁,同一时刻只能有一个线程访问这个访问/对象
wait():必须先获得一个对象的锁,才能执行这个方法,即必须在同步块中执行,必须其他线程调用了notify或notifyAll,否则会永远等待
wait(time):指定一个超时时间,如果没有其他线程持有这个对象,超时自动再次拥有这个对象,如果有其他线程持有了这个对象,当其他线程释放了这个对象,再次拥有
notify(),notifyAll():释放资源,和wait一样,必须在同步块中执行,notify只通知一个线程来获得资源,notifyAll通知全部线程来获得资源,具体谁获得资源,由系统来调度

【Java】【线程同步】sleep,join,yield,synchronized,wait,notify