9

add現在のスレッドをブロックせずに、少し遅れてHashSetの関数を呼び出したい。このようなことを達成するための簡単な解決策はありますか?

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

3 に答える 3

13

単純なバニラソリューションは次のようになります。

    new Thread( new Runnable() {
        public void run()  {
            try  { Thread.sleep( 1000 ); }
            catch (InterruptedException ie)  {}
            myHashSet.add( foo );
        }
    } ).start();

ここでは、ThreadPoolExecutorよりも舞台裏で行われていることがはるかに少なくなっています。TPEはスレッドの数を制御するのに便利ですが、スリープまたは待機している多数のスレッドをスピンオフする場合、それらの数を制限すると、パフォーマンスが低下する可能性があります。

myHashSetまた、これをまだ処理していない場合は、同期する必要があります。これがうまくいくためには、どこでも同期する必要があることを忘れないでください。これを処理する方法は他にもあります。たとえば、Collections.synchronizedMapやConcurrentHashMapなどです。

于 2012-06-04T16:19:11.400 に答える
12

ScheduledThreadPoolExecutor.scheduleを使用できます。

ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);

exec.schedule(new Runnable() {
          public void run() {
              myHashSet.add(foo);
          }
     }, 1, TimeUnit.SECONDS);

別のスレッドで1秒後にコードが実行されます。ただし、同時変更には注意してくださいmyHashSet。別のスレッドから同時にコレクションを変更している場合、またはコレクションを反復処理しようとしている場合は、問題が発生する可能性があり、ロックを使用する必要があります。

于 2012-06-04T14:04:32.377 に答える
0

ThreadPoolExecutor.schedule()メソッドを確認してください。

于 2012-06-04T14:02:00.583 に答える