修改运行的Java程序

时间:2014-08-01 19:49:27

标签: java

我已经启动了我的程序,它有两个这样的循环:

for(int i=0;i<100;i++)
    String[] articles = getArticles(i);
    for(int j=0;j<articles.length;j++)
        process(articles[j]);

我可以修改正在运行的程序,使其在i = 1处停止吗?如果该怎么做?

该程序需要数天才能完成,我想停下来,但我必须知道它停在哪里,以便下次我可以恢复它。

5 个答案:

答案 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]);。)

您可以在处理完每篇文章后将ij的上一个值保存到文件中,然后您可以随时终止您的程序,下次只需读取{{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。你可能想要改变它。