add
現在のスレッドをブロックせずに、少し遅れてHashSetの関数を呼び出したい。このようなことを達成するための簡単な解決策はありますか?
Utils.sleep(1000, myHashSet.add(foo)); //added after 1 second
//code here runs immediately without delay
...
add
現在のスレッドをブロックせずに、少し遅れてHashSetの関数を呼び出したい。このようなことを達成するための簡単な解決策はありますか?
Utils.sleep(1000, myHashSet.add(foo)); //added after 1 second
//code here runs immediately without delay
...
単純なバニラソリューションは次のようになります。
new Thread( new Runnable() {
public void run() {
try { Thread.sleep( 1000 ); }
catch (InterruptedException ie) {}
myHashSet.add( foo );
}
} ).start();
ここでは、ThreadPoolExecutorよりも舞台裏で行われていることがはるかに少なくなっています。TPEはスレッドの数を制御するのに便利ですが、スリープまたは待機している多数のスレッドをスピンオフする場合、それらの数を制限すると、パフォーマンスが低下する可能性があります。
myHashSet
また、これをまだ処理していない場合は、同期する必要があります。これがうまくいくためには、どこでも同期する必要があることを忘れないでください。これを処理する方法は他にもあります。たとえば、Collections.synchronizedMapやConcurrentHashMapなどです。
ScheduledThreadPoolExecutor.scheduleを使用できます。
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.schedule(new Runnable() {
public void run() {
myHashSet.add(foo);
}
}, 1, TimeUnit.SECONDS);
別のスレッドで1秒後にコードが実行されます。ただし、同時変更には注意してくださいmyHashSet
。別のスレッドから同時にコレクションを変更している場合、またはコレクションを反復処理しようとしている場合は、問題が発生する可能性があり、ロックを使用する必要があります。
ThreadPoolExecutor.schedule()メソッドを確認してください。