我有很多设施。无论何时启用设施,他们都会调用某个类,以便它们可以按固定的预定速率运行。如果设施关闭,我需要关闭该特定设施的线程。当我尝试关闭并稍后重新打开同一设施时,我怎么能实现我得到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");
}
如何找到该特定设施的线程。我不擅长线程。任何帮助将不胜感激
答案 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;
}
...