在一个Java ZK应用程序的ViewModel中,我有多个执行特定函数的线程。第一次该函数由任何线程执行需要很长时间,但在执行一次之后,它会在其他线程执行时立即返回,因为它具有在缓存中检索到的值。但它应该首次被一个线程执行,就好像多个线程执行该函数一样,它不会返回到其中的任何一个线程,因为当每个线程调用相同的函数并因此缓存保持为空时,返回的时间相加为他们所有。 那么如何让其他线程等待第一个线程完成,因为这些线程属于不同的对象,因此同步该方法在这里将不起作用。在这里可以使用一个变量与其他线程通信第一个线程已经完成吗?请注意,所有线程都属于同一个类的不同对象,即ViewModel,它不能扩展线程类或实现Runnable,因为它是ZK框架类。 可以建议任何解决方案。让线程等待执行另一个线程
回答
是这样的:
static Object lock;
...
if (objectYouAreHopingHasBeenCached == null) {
synchronized (lock) {
if (objectYouAreHopingHasBeenCached == null) {
// fetch the object, put in in objectYouAreHopingHasBeenCached
}
}
}
return objectYouAreHopingHasBeenCached;
大部分时间都可以使用,但并非总是如此。第二个线程可以在第一个线程完成后比较'objectYouAreHopingHasBeenCached'到null,但是恰好在第一个线程获得锁之前。 – Hoopje
这就是为什么我在同步块中再次检查对象。这样,您就可以拥有两全其美的领域 - 确保只取一次,但如果已经存在同步块,则快捷方式 – ControlAltDel
Java 5 +中的双重检查锁定已经修复,只要该字段为* ** volatile **在这种情况下,在类声明中:'private volatile Object objectYouAreHopingHasBeenCached;' – dkatzel
- 1. 如何让一个线程等待并执行另一个?
- 2. 主线程不会等待另一个线程完成执行
- 3. 如何让一个线程等待另一个线程?
- 4. 如何让1个UI线程等待另一个UI线程
- 5. 等待另一个线程
- 6. 让线程等待
- 7. 当主线程继续执行时,执行两个等待另一个线程的线程
- 8. 如何让一个线程等待另一个线程的一部分完成?
- 9. 如何让一个java线程等待另一个线程的结果?
- 10. 如何让一个线程等待另一个线程?第2章
- 11. 如何让一个线程等待另一个线程导致java?
- 12. 如何让线程等到另一个线程完成该方法执行
- 13. 等待执行程序服务线程
- 14. 异步/等待另一个线程ID
- 15. 爪哇等待在另一个线程
- 16. MFC主线程等待另一个线程结束
- 17. 线程正在等待另一个线程
- 18. 如何等待线程直到另一个线程完成
- 19. 当前线程在等待另一个线程时睡眠
- 20. Python线程卡在另一个线程等待用户输入
- 21. 如何让两个线程彼此等待执行任务?
- 22. Ruby多线程:让一个线程等待来自另一个线程的信号
- 23. 多线程 - 等待线程
- 24. C# - 如何让这个线程等待?
- 25. 等待线程完成执行上
- 26. C#线程同步(等待执行)
- 27. 等待线程池完成执行
- 28. 等待线程完成执行
- 29. 多线程的Java如何让线程等待一段时间
- 30. 等待线程
同步缓存值。 –