我已经启动了我的程序,它有两个这样的循环:
for(int i=0;i<100;i++)
String[] articles = getArticles(i);
for(int j=0;j<articles.length;j++)
process(articles[j]);
我可以修改正在运行的程序,使其在i = 1处停止吗?如果该怎么做?
该程序需要数天才能完成,我想停下来,但我必须知道它停在哪里,以便下次我可以恢复它。
答案 0 :(得分:3)
不幸的是,除非打开调试器,否则无法在可预测的位置停止正在运行的程序。
停止程序,更改代码,然后重新启动。
答案 1 :(得分:2)
有可能(很多事情都是)。但它可能非常非常困难 - 除非你擅长查看Java字节码并了解你的操作系统内部结构,否则我不会尝试。
假设您在linux下运行,您可以通过kill -STOP <pid>
和kill -CONT <pid>
暂停和重启进程。您还可以通过jstack获取正在运行的java进程的堆栈跟踪,并查看正在运行的线程和反编译代码。
答案 2 :(得分:0)
你可以这样做
static boolean stopLoop = false;
static int[] runLoop(int i, int j) {
for(;i<100;i++) {
if(stopLoop) return new int[i, j];
String[] articles = getArticles(i);
for(;j<articles.length;j++) {
process(articles[i]);
}
j = 0;
}
}
答案 3 :(得分:0)
(您可能想在内循环中编写process(articles[j]);
。)
您可以在处理完每篇文章后将i
和j
的上一个值保存到文件中,然后您可以随时终止您的程序,下次只需读取{{1来自您文件的{}和i
,您无需再次处理它们。
或者每个程序运行设置100个文章处理,或者处理20分钟,有很多可能性。
答案 4 :(得分:0)
没有直接的方法可以做到这一点,但是可以做一些额外的腿部工作。一种方法是将最新成功的迭代输出到持久存储(如文件),然后读取文件(如果存在)以找出从哪里开始。下面的示例显示了一种方法:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
public class Test
{
public static void main(String[] args)
{
int start;
// Try to get the last successful run
File file = new File(System.getenv("HOME"), ".myprog");
if(file.exists()) {
try(BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line = reader.readLine();
if(line == null) {
throw new NumberFormatException("Empty file, no number");
}
start = Integer.parseInt(line);
} catch(IOException | NumberFormatException ex) {
System.err.println("Unable to read progress: " + ex.getMessage());
System.err.println("Starting from the beginning");
start = 0;
}
} else {
start = 0;
}
// ... Your declarations go here
for(int i = start; i < 100; i++) {
String[] articles = getArticles(i);
for(int j=0;j<articles.length;j++) {
process(articles[i]);
}
// Record last successful run (this reopens the file every time)
try(PrintWriter writer = new PrintWriter(file)) {
writer.println(i);
} catch(IOException ex) {
System.err.println("Unable to record progress: " + ex.getMessage());
}
}
}
}
请注意,我在Linux计算机上运行,因此我调用了文件~/.myprog
。你可能想要改变它。