gpt4 book ai didi

java - 如何在任务超时 x 次后停止任务

转载 作者:行者123 更新时间:2023-12-02 03:07:02 28 4
gpt4 key购买 nike

我正在尝试执行一个可运行程序几次,如果它没有在 x 秒内完成 3 次,我将取消它。

我用来模拟需要取消任务的情况的代码如下。从输出中我可以看到 InterruptedException 被抛出并相应地捕获,但任务仍在运行。

似乎前两次任务在抛出 3 次 TimeoutException 之前运行,这两次运行一直持续运行直到完成。我想知道是否有办法阻止这两次运行完成?

public class SomeClass {

private static int c =0;

public static void main(String[] args){
Runnable dummyRunnable = new Runnable() {

@Override
public void run() {
System.out.println("Hello from dummyRunnable!");

for (int i =0; i< 10; i++){
try {
//simulate work here
if (!Thread.currentThread().isInterrupted()) Thread.sleep(5000);
System.out.println("thread sleeps for the " + i + " time!");
} catch (InterruptedException ie){
System.out.println("InterruptedException catched in dummyRunnable!");
//Thread.currentThread().interrupt(); //this has no effects
break;

}
}



}
};


BlockingQueue<Runnable> blockingQueue = new ArrayBlockingQueue<Runnable>(10 * 3, true);
ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 3, Long.MAX_VALUE, TimeUnit.MILLISECONDS, blockingQueue);

for (int i =0; i< 5; i++){
Future<?> task = executor.submit(dummyRunnable);

try{
Thread.sleep(1000);
task.get(2000, TimeUnit.MILLISECONDS);
} catch (TimeoutException te){
c++;
System.out.println("TimeoutException from a task!");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (c==3){
System.out.println("cancelling task...");
task.cancel(true);
break;
}
}
}
}
}

最佳答案

我不明白你实际上想模拟什么。我希望有一个模拟,比如用卡付款(60 秒超时完成任务)或者医生与病人的情况下的秘书。

按照现在的情况,您正在创建 future 的 5 个对象。如果您想要对线程进行更多控制,您应该考虑使用同步方法和一个为您处理线程的监视器。

通常在启动线程时您应该使用

new Thread(new Task(object or generics)).start();
Thread.sleep(2000); // calls this thread to wait 2 secs before doing other task(s)

在进行一些硬核并发(多线程)之前,您应该阅读一些 Java 教程以获得一些灵感... http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

关于java - 如何在任务超时 x 次后停止任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15329380/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com