我想在延迟一段时间后调用 HashSet 的 add
函数,但不阻塞当前线程。有没有简单的解决方案可以实现类似这样的功能:
Utils.sleep(1000, myHashSet.add(foo)); //added after 1 second
//code here runs immediately without delay
...
我想在延迟一段时间后调用 HashSet 的 add
函数,但不阻塞当前线程。有没有简单的解决方案可以实现类似这样的功能:
Utils.sleep(1000, myHashSet.add(foo)); //added after 1 second
//code here runs immediately without delay
...
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.schedule(new Runnable() {
public void run() {
myHashSet.add(foo);
}
}, 1, TimeUnit.SECONDS);
它将在单独的线程上延迟1秒后执行您的代码。但是请注意,同时从不同的线程修改集合myHashSet
可能会导致并发修改问题,如果您需要在不同的线程中同时修改集合或尝试遍历它,则需要使用锁。
最基本的解决方案是:
new Thread( new Runnable() {
public void run() {
try { Thread.sleep( 1000 ); }
catch (InterruptedException ie) {}
myHashSet.add( foo );
}
} ).start();
与ThreadPoolExecutor相比,这里的后台操作要少得多。ThreadPoolExecutor可以方便地控制线程数,但如果您正在创建大量休眠或等待的线程,则限制它们的数量可能会对性能产生更大的负面影响。
如果您尚未处理过此问题,则需要在myHashSet
上进行同步。请记住,为了使其起到作用,您必须在任何地方进行同步。还有其他的处理方法,例如使用Collections.synchronizedMap或ConcurrentHashMap。