【发布时间】:2013-03-18 09:11:36
【问题描述】:
我有一个两部分的问题...
我有一个类,其中有一个函数,在给定时间只能由任何一个线程访问。使它成为
synchronized函数或synchronized块仍然允许多个线程,因为不同的线程在类中访问它。如何确保只有一个线程访问此代码? (见下面的代码示例)-
使用同步函数,对该函数的调用会排队。有没有办法只允许最后一次调用函数来访问代码?因此,如果我当前有 Thread1 访问我的函数,那么 Thread2 和 Thread3 会尝试访问它(按此顺序),一旦 Thread1 完成,将只授予 Thread3 访问权限。
public void doATask() { // I create a new thread so the interface is not blocked new Thread(new Runnable() { @Override public void run() { doBackgroundTask(); } }).start(); } private void doBackgroundTask(MyObject obj) { // perform long task here that is only being run by one thread // and also only accepts the last queued thread }
感谢您的帮助!
【问题讨论】:
-
被取消的线程应该怎么办?他们应该被终止还是返回哨兵或抛出异常?是否应该在另一个线程尝试调用该方法时立即取消被取消的线程,还是应该在线程 1 完成时取消它?这里的歧义太多了,你想做什么?
-
线程 2 发生了什么?它应该在线程 3 到达时退出吗?抛出一些异常?
-
第二个线程应该被终止。它不需要抛出异常。它可以被忽略。并且可以随时取消被取消的线程......只要另一个线程尝试调用该方法或当 Thread1 完成时。
-
@Nick:如果是这样,那么您可能不想使用线程,而是可能需要某种事件驱动系统。
-
好吧,doATask() 函数是由用户按下按钮引起的。在这种情况下,用户正在扫描一堆对象,以便他们快速点击按钮。
标签: java synchronization synchronized synchronized-block