如何进行延迟非阻塞函数调用

时间:2012-06-04 14:00:50

标签: java multithreading thread-safety nonblocking

我想用一些延迟调用HashSet的add函数,但不阻塞当前线程。是否有一个简单的解决方案来实现这样的目标:

Utils.sleep(1000, myHashSet.add(foo)); //added after 1 second
//code here runs immediately without delay
...

3 个答案:

答案 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)