3.2.1 Java多线程常见方法

Object的方法

wait()

让线程进入等待状态,直到被notify。线程释放锁。(只能在同步方法中调用)

void wait(long millis) 和void wait(long millis,int nanos)

同上,导致线程进入等待状态直到它被通知或者经过指定的时间。

notify()

随机选择一个在该对象上调用wait()方法的线程,解除其阻塞状态。(只能在同步方法中调用)

notifyAll()

解除所有那些在该对象上调用wait方法的线程的阻塞状态。(只能在同步方法中调用)

FAQ:为什么要在synchronized方法或代码块中调用?
这几个方法要求当前正在运行object.wait()方法的线程拥有object的对象锁。即使你确实知道当前上下文线程确实拥有了对象锁,也不能将object.wait()这样的语句写在当前上下文中。

Thread的方法

sleep()

让线程进入阻塞状态,不会释放锁。也就是说如果当前线程持有对某个对象的锁,则即使调用sleep方法,其他线程也无法访问这个对象。

yield()

让当前线程从运行状态 转为 就绪状态,以允许具有相同优先级的其他线程获得运行机会。

join()

两个线程t1、t2,t1调用t2.join(), 会阻塞t1直到t2执行完毕。
join也是通过wait()实现。简化:

join() {
	while(isAlive()) {
		wait();
	}
}

只要t2 isAlive, 就调用wait()。此时的wait()是t2的方法,但是在t1线程中调用,所以是t1持有t2的锁,阻塞的也是t1。

线程的状态流转图
https://blog.csdn.net/m0_48273471/article/details/123801712 这个图感觉靠谱

生产者消费者

生产者消费者:
BlockQueue的实现
一篇生产者消费者很详细的文章

你可能感兴趣的:(面试,Java,Android,java,开发语言,大数据)