最近在看 effective java 里面有一个关于死锁的例子
其中有一处代码是调用 ExecutorService.submit() 方法返回后的 Future 对象的 get 方法
现在问题是如果不调用 get 方法就不会有死锁问题。
刚开始还理解为并不是死锁,是 get 导致线程挂起,但是把 get 方法去掉就又不会出现程序挂起这个现象。
想请教下这个 get 方法是什么机制?为什么调用后才会出现死锁问题? 看API描述的也不是很明白。(我看中文的。。。
)
API说明:
引用
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功 完成时将会返回 null。
public static void main(String[] args) {
ObservableSet<Integer> set = new ObservableSet<Integer>(new HashSet<Integer>());
set.addObserver(new SetObserver<Integer>() {
public void added(final ObservableSet<Integer> s, Integer e) {
System.out.println(e);
if (e == 23){
ExecutorService executor = Executors.newSingleThreadExecutor();
final SetObserver<Integer> observer = this;
try {
executor.submit(new Runnable() {
public void run() {
s.removeObserver(observer);
}
}).get(); //为什么调用get方法会产生死锁,不调就不会有死锁问题?
} catch (Exception ex) {
throw new AssertionError(ex.getCause());
} finally {
executor.shutdown();
}
}
}
});
for (int i = 0; i < 100; i++) {
set.add(i);
}
}
public class ObservableSet<E> extends ForwardingSet<E> {
public ObservableSet(Set<E> s) {
super(s);
}
private final List<SetObserver<E>> observers = new ArrayList<SetObserver<E>>();
public void addObserver(SetObserver<E> observer){
synchronized (observers) {
observers.add(observer);
}
}
public boolean removeObserver(SetObserver<E> observer){
synchronized (observers) {
System.out.println("--removeObserver--");
return observers.remove(observer);
}
}
private void notifyElementAdded(E element){
synchronized (observers) {
for (SetObserver<E> observer: observers) {
observer.added(this, element);
}
}
}
public boolean add(E element){
boolean added = super.add(element);
if (added)
notifyElementAdded(element);
return added;
}
public boolean addAll(Collection<? extends E> c) {
boolean result = false;
for (E element : c)
result = add(element);
return result;
}
}
相关推荐
"的疑问句结构。 2. C. warm:"Put on this jacket, it will keep you warm."这里的"keep sb. warm"表示保暖,所以选"C. warm"。 3. C. take care of:老到足以照顾自己,用"take care of oneself",因此选"C. take ...
常见的时间状语包括:tomorrow(明天)、next week(下周)、in the future(将来)等。 题目答案: 1. B. gets 2. C. Do 3. B. isn't 4. A. always 5. A. seldom 附加题目解答: 1. - How are they going to get ...
3. **No matter + 疑问词** 结构的使用是本课件的重点之一。如 "No matter how hard"、"No matter where" 等,它们可以引导让步状语从句,表达无论在何种情况下,某事都会发生。此外,"no matter" 可以换成 ...
9. 将来时态:"He is going to be an artist in the future." 使用 "be going to" 结构表示将来打算成为什么。 10. 形容词比较级:"She is stronger than me." 使用比较级表示更强大。 11. 时间介词:"I usually ...
1. "Students will go to school in the future." 变为一般疑问句即 "Will students go to school in the future?" 2. "There will be some robots in our homes." 改为否定句是 "There won't be any robots in our ...
【英语八年级(下册)】的语法和...通过学习这些语法点和短语,学生能够更准确地表达关于未来可能性和过去计划或预期的句子,同时提升阅读理解能力。在实际应用中,这些知识对于日常对话、写作和阅读理解都至关重要。
同时,"be/become/get used to sth"表示"习惯于某事物","be/become/get used to doing sth"则表示"习惯于做某事"。 3. "not a little"相当于"very","not a bit"等于"not…at all",表示"非常"或"一点也不"。 三. ...
2. `apt-get`和`yum`命令:更底层的包管理工具,通常用于升级系统或安装软件。 3. `dpkg`:Debian系统的包管理器,用于安装和管理.deb格式的软件包。 七、文件系统与磁盘管理 1. `df`:显示磁盘空间使用情况。 2. ...
这篇文档是针对上海牛津英语7B教材Unit 7 "In the future"的单元练习题,旨在帮助学生复习和巩固本单元关于未来预测、可能的情景以及与未来相关词汇和语法的知识点。以下是对这些练习题中涉及的主要知识点的详细说明...
3. 预测未来:在题目中出现了“predict the future”,这是关于预测和未来规划的表达,涉及到英语中的预测句型,如"I predict that..."。 4. 日常生活场景:题目涵盖了一些日常生活场景的描述,如“live in an ...
3. 特殊疑问句的构成:"What life will be like in the future?"考察的是对未来生活状况提问的句式,正确答案是C. What life will be like。 4. 将来时态的运用:"There will be..." 是将来时态的一种表达方式,...
在本单元的学习中,我们将探讨一个非常有趣的话题——未来的世界,特别是关于机器人和技术对人类生活的影响。Unit 7 "Will people have robots?" 是一个探讨未来科技发展的课程,旨在帮助学生了解并预测科技进步如何...
流行的”,"get on [well] with sb." 或 "get along [well] with sb." 意思是“与某人相处(好)”。此外,"didn't" 和 "couldn't" 分别是 "did not" 和 "could not" 的缩写形式,"as ... as possible" 用于强调尽...
- in future(将来) - in 8 minutes(八分钟内) 2. 活动与动作: - go sightseeing(去观光) - go swimming(去游泳) - have a picnic(野餐) - have a piano lesson(上钢琴课) - do some sports(做...
这篇资料是针对六年级学生的一份英语同步练习,主题为"The Year 2050",具体是关于Unit 9 Lesson 1 "Enjoy the Story"的内容。这份练习旨在帮助学生巩固与未来、科技、生活场景相关的词汇和语法知识。 一、翻译部分...
in the future在未来;once a week每周一次;in the past在过去。根据句意,噪音污染在过去是个严重问题,故选D. in the past。 8. 副词短语:from time to time表示“不时,偶尔”,符合题意,表示学院不时邀请...
5. **时态**:第六题中,由“in the near future”可知要用一般将来时,所以选B. will build。 6. **情态动词**:第七题表示能力,can’t表示“不能”,符合题意。 7. **非谓语动词**:第八题考查动词不定式作宾补...
2. 一般将来时态(The Simple Future Tense):用于表示即将发生的动作或状态,常用的时间状语有tomorrow、next week等。基本结构有两种形式:am/is/are going to + do 和 will/shall + do。否定形式和疑问句结构也...
4. 希望成为:第9题"I hope _____ a teacher in the future.",希望做某事通常用"hope to do"结构,因此正确答案是"to become"。 5. 用英语说:第10题"Could you tell me how to _____ it in English?",表示用英语...
根据"in the future",可以判断出这里要用一般将来时,因此填"will become"。 13. 第十四题考查现在完成时态。"has gone to"表示已经去了某地且未返回,符合句意。 14. 第十五题涉及情态动词"need"的否定形式。在...