如何在ScheduledExecutorService中仅关闭选定的线程?

时间:2012-02-17 19:36:37

标签: java multithreading

我有很多设施。无论何时启用设施,他们都会调用某个类,以便它们可以按固定的预定速率运行。如果设施关闭,我需要关闭该特定设施的线程。当我尝试关闭并稍后重新打开同一设施时,我怎么能实现我得到RejectedExecutionException。感谢帮助。我的代码类似如下:

 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");

}

如何找到该特定设施的线程。我不擅长线程。任何帮助将不胜感激

2 个答案:

答案 0 :(得分: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 :(得分:1)

你试过syncThreadHandle.cancel(true)吗?如果您希望它以true中断当前正在运行的线程,则应使用false。我不确定它是否会被重新安排。

如果它确实被重新安排,那么你可能别无选择,只能放置一些将禁用该任务的布尔值。类似的东西:

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