外部结束无限循环 java
externally ending infinite loop java
我正在编写一个程序来标记一组学生提交的算法。我打算将他们的算法方法复制到程序中并 运行 运行它以查看结果;但是,要求算法不运行超过10秒。
我构建了一个 ExecutorService 来结束适用于 userInput 算法(已注释掉)但不适用于无限循环的算法。
根据我对线程的了解,中断它需要更改算法(添加标志),并且停止线程是贬值的,那么有没有其他方法可以在不更改算法的情况下结束无限循环?
代码如下:
public class TestAlgo{
private String move;
public static void main(String[] args){
TestAlgo testAlgo = new TestAlgo();
testAlgo.runGame();
}
public void runGame(){
Cram game = new Cram();
boolean start = game.startGame();
while (start){
ExecutorService executor = Executors.newSingleThreadExecutor();/////
Future<String> future = executor.submit(new Task());/////
move = "";
try {
System.out.println("Started..");
move = future.get(10, TimeUnit.SECONDS);
System.out.println("Finished!");
} catch (TimeoutException e) {
future.cancel(true);
move = "Timeout";
System.out.println("Terminated!");
} catch (InterruptedException ie){
System.out.println("Error: InterruptedException");
} catch (ExecutionException ee){
System.out.println("Error: ExecutionException");
}
System.out.println("Move: " + move);
executor.shutdownNow();
if (game.sendMove(move)) break;
game.printBoard();
if (game.getMove()) break;
game.printBoard();
}
}
// public static String algorithm(){
// while (true){ //infinite loop
// System.out.println("Algo is running...");
// }
// return "test";
// }
public static String algorithm(){
Scanner userInputScanner = new Scanner(System.in);
System.out.print("Please enter your move: ");
String input = userInputScanner.nextLine();
return input;
}}
class Task implements Callable<String> {
@Override
public String call() throws Exception {
String move = TestAlgo.algorithm();
return move;
}}
您可以在 while
循环中完成您的话题:
public static String algorithm(){
long start = System.currentTimeMillis();
long end = start + 10*1000; // 10 seconds?
while (System.currentTimeMillis() < end){ //not-so-infinite loop
System.out.println("Algo is running...");
}
return "test";
}
但是如果你不想修改algorithm()
方法,你可以检查this, or this。
作为 运行 JVM 线程中不受信任代码的替代方法,请考虑使用 ProcessBuilder 启动一个单独的进程。然后,您可以使用 Process destroyForcibly 方法终止它。
Google Guava's SimpleTimeLimiter 应该有帮助。只需将 ExecutorService
包裹在 SimpleTimeLimiter
中,然后使用 callWithTimeout
方法指定给定的超时时间;处理 UncheckedTimeoutException
以指示已达到超时。最后,调用包裹在SimpleTimeLimiter
.
中的ExecutorService
的shutdown
方法
我正在编写一个程序来标记一组学生提交的算法。我打算将他们的算法方法复制到程序中并 运行 运行它以查看结果;但是,要求算法不运行超过10秒。
我构建了一个 ExecutorService 来结束适用于 userInput 算法(已注释掉)但不适用于无限循环的算法。
根据我对线程的了解,中断它需要更改算法(添加标志),并且停止线程是贬值的,那么有没有其他方法可以在不更改算法的情况下结束无限循环?
代码如下:
public class TestAlgo{
private String move;
public static void main(String[] args){
TestAlgo testAlgo = new TestAlgo();
testAlgo.runGame();
}
public void runGame(){
Cram game = new Cram();
boolean start = game.startGame();
while (start){
ExecutorService executor = Executors.newSingleThreadExecutor();/////
Future<String> future = executor.submit(new Task());/////
move = "";
try {
System.out.println("Started..");
move = future.get(10, TimeUnit.SECONDS);
System.out.println("Finished!");
} catch (TimeoutException e) {
future.cancel(true);
move = "Timeout";
System.out.println("Terminated!");
} catch (InterruptedException ie){
System.out.println("Error: InterruptedException");
} catch (ExecutionException ee){
System.out.println("Error: ExecutionException");
}
System.out.println("Move: " + move);
executor.shutdownNow();
if (game.sendMove(move)) break;
game.printBoard();
if (game.getMove()) break;
game.printBoard();
}
}
// public static String algorithm(){
// while (true){ //infinite loop
// System.out.println("Algo is running...");
// }
// return "test";
// }
public static String algorithm(){
Scanner userInputScanner = new Scanner(System.in);
System.out.print("Please enter your move: ");
String input = userInputScanner.nextLine();
return input;
}}
class Task implements Callable<String> {
@Override
public String call() throws Exception {
String move = TestAlgo.algorithm();
return move;
}}
您可以在 while
循环中完成您的话题:
public static String algorithm(){
long start = System.currentTimeMillis();
long end = start + 10*1000; // 10 seconds?
while (System.currentTimeMillis() < end){ //not-so-infinite loop
System.out.println("Algo is running...");
}
return "test";
}
但是如果你不想修改algorithm()
方法,你可以检查this, or this。
作为 运行 JVM 线程中不受信任代码的替代方法,请考虑使用 ProcessBuilder 启动一个单独的进程。然后,您可以使用 Process destroyForcibly 方法终止它。
Google Guava's SimpleTimeLimiter 应该有帮助。只需将 ExecutorService
包裹在 SimpleTimeLimiter
中,然后使用 callWithTimeout
方法指定给定的超时时间;处理 UncheckedTimeoutException
以指示已达到超时。最后,调用包裹在SimpleTimeLimiter
.
ExecutorService
的shutdown
方法