2012-02-17 11 views
3

私は多くの施設を持っています。施設が稼動するたびに、一定の定刻率で稼働できるようにクラスが呼び出されます。施設が閉鎖されている場合は、その特定の施設のスレッドを停止する必要があります。後で同じ施設をシャットダウンして再度開くときに、RejectedExecutionExceptionを取得していることをどうすれば達成できますか?手伝ってくれてありがとう。私のコードは次のように類似しています:ScheduledExecutorServiceで選択したスレッドのみをシャットダウンする方法はありますか?

private static final ScheduledExecutorService svc = Executors 
     .newSingleThreadScheduledExecutor(); 
private static ScheduledFuture<?> syncThreadHandle = null; 

public static void start(final String str1, final String str2) { 

    syncThreadHandle = svc.scheduleAtFixedRate(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("First string for this thread str1 " + str1 
        + " Str2 " + str2); 
     } 

    }, 0, 1, TimeUnit.MINUTES); 
} 

public static void stop(final String str1, final String str2) { 
    svc.shutdown(); 
} 

//そして私はこれを使っています。

public static void main(String args[]) 
     { 

    ProcessFixedRun.start("hi", "hello"); 
    ProcessFixedRun.start("hi agaIN", "hello again"); 
    ProcessFixedRun.stop("hi", "hello"); 

} 

どのように特定の施設のスレッドを見つけることができますか?私はスレッドにうまくいきません。どんな助けもありがとうございます

+0

スレッドを中断することはできますが、サービスは新しいスレッドを生成します – Adrian

答えて

2

ScheduleFutureをマップに保存してから、キーに基づいてキャンセルできますか?

static ConcurrentMap<String,ScheduledFuture<?>> futures = new ConcurrentHashMap<>(); 

    public static void start(final String str1, final String str2) { 

    String key = str1+str2; 
    futures.put(key , syncThreadHandle = svc.scheduleAtFixedRate(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("First string for this thread str1 " + str1 
        + " Str2 " + str2); 
     } 

    }, 0, 1, TimeUnit.MINUTES)); 
} 

public static void stop(final String str1, final String str2) { 
    futures.get(str1+str2).cancel(true); 
} 

キーはstr1またはstr2(またはその両方)です。

+1

こんにちは私はこの方法を使用し、私は仕事を再スケジュールし、キャンセルすることができました。 – rockjava

1

syncThreadHandle.cancel(true)を試しましたか?現在実行中のスレッドを中断したい場合はtrueを、それ以外の場合はfalseを使用する必要があります。しかし、それが再スケジュールされるかどうかはわかりません。

再スケジューリングされた場合、タスクを無効にする何らかのブール値を設定する以外に選択肢がない可能性があります。次のようなものがあります:

@Override 
public void run() { 
    if (!stillRunning) { 
     return false; 
    } 
    ... 
+1

+1: '.cancel(true)'を意味しますか? –

+0

右、感謝のピーター。 – Gray

+0

'オーバーライドするのではなく、中断したい場合は真実ですか? –

関連する問題