java多线程学习-4
问:多线程之间通信方法有哪些?
》wait(),notify(),notifyAll()。
问:以上三个方法的使用场景、使用方法与注意事项有哪些?
》
* 多个线程通信 * wait(),notify(),notifyAll() * * wait(),当前线程立即进入阻塞状态,并释放同步监视器 * notify(),一旦执行此方法,就会释放被wait的线程。如果多个,只唤醒优先级高的那个 * notifyAll(),一旦执行此方法,就会释放所有被wait的线程 * * 这三个方法只能放在同步代码块或同步方法中 * 这三个方法必须是同步代码块或者同步方法中的同步监视器
问:请解释一下sleep()和wai()两个方法的异同点?
》
相同点
都可以使当前线程立即处于阻塞状态
不同点:
1、调用者不同。wait()是Object类中的方法,二sleep()是Thread中的方法
2、调用时机不同:sleep没有限制,但是wait只能在synchronized同步代码块中调用【由同步监视器调用】。
3、sleep()不会释放锁。wait()会释放锁。导致的结果就是:sleep容易抢占锁,发生死锁现象
问:创建线程一共有哪几种方法?
》四种:继承Thread,实现Runnable,实现Callable接口,线程池
问:继承Callable这种方式创建线程相比较与继承Runnable,有什么优点?
》1、call()方法有返回值,而run()方法没有返回值。有返回值便于线程间通信。
2、call()方法可以抛出一个异常,run()方法没有
3、Callable接口支持泛型