0 0

关于 Future get方法的疑问0

最近在看 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;
	}
}
2014年9月22日 21:21

1个答案 按时间排序 按投票排序

0 0

给你个分析这个类的源码的解释吧
http://www.cnblogs.com/daxin/p/3969864.html

2014年9月23日 08:16

相关推荐

Global site tag (gtag.js) - Google Analytics