我想用一些延迟调用HashSet的add
函数,但不阻塞当前线程。是否有一个简单的解决方案来实现这样的目标:
Utils.sleep(1000, myHashSet.add(foo)); //added after 1 second
//code here runs immediately without delay
...
答案 0 :(得分:10)
普通香草解决方案将是:
new Thread( new Runnable() {
public void run() {
try { Thread.sleep( 1000 ); }
catch (InterruptedException ie) {}
myHashSet.add( foo );
}
} ).start();
与ThreadPoolExecutor相比,这里的幕后工作要少得多。 TPE可以很方便地控制线程的数量,但是如果你正在关闭大量休眠或等待的线程,限制它们的数量可能会比它的帮助更多地损害性能。
如果您尚未处理此问题,则希望在myHashSet
上进行同步。请记住,您必须同步到处才能做到这一点。还有其他方法可以处理这个问题,比如Collections.synchronizedMap或ConcurrentHashMap。
答案 1 :(得分:4)
您可以使用ScheduledThreadPoolExecutor.schedule:
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.schedule(new Runnable() {
public void run() {
myHashSet.add(foo);
}
}, 1, TimeUnit.SECONDS);
它将在一个单独的线程上1秒后执行您的代码。但要注意myHashSet
的并发修改。如果您是从另一个线程同时修改集合或尝试迭代它,则可能遇到麻烦并且需要使用锁。
答案 2 :(得分:1)