带有受控退出的无限循环

时间:2017-06-14 07:54:05

标签: java loops batch-processing exit

我需要一个无限循环的批处理程序。在这个循环中,他正在做某事,然后等待x秒。现在问题是,如何从程序外部停止循环?一个选项是读取文件并在s.o时中断。如果我总是打开和关闭文件,那就在里面“停止”,但它是如何与性能相关的?

是不是可以在同一运行时内启动第二个线程,例如将布尔'run'设置为false或其他? 这是我的代码“stop-file”。

 Integer endurance = args[3] != null ? new Integer(args[3]) : new Integer(System.getProperty("endurance"));
 BufferedReader stop = new BufferedReader(new FileReader(args[4] != null ? args[4] : System.getProperty("StopFile")));
        while (!stop.readLine().toUpperCase().equals("STOP"))
        {
            doSomething(args);
            try {
                Thread.sleep(endurance);
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.exit(12);
            }
            stop.close();
            stop = new BufferedReader(new FileReader(args[4] != null ? args[4] : System.getProperty("StopFile")));
        }

4 个答案:

答案 0 :(得分:0)

我之前在Android中做过这样的事情。我在子线程中启动逻辑并从父线程发送中断信号。示例代码有点像下面。

   class TestInterruptingThread1 extends Thread
{
    public void run()
    {
        try
        {
            //doBatchLogicInLoop();
        }
        catch (InterruptedException e)
        {
            throw new RuntimeException("Thread interrupted..." + e);
        }

    }

    public static void main(String args[])
    {
        TestInterruptingThread1 t1 = new TestInterruptingThread1();
        t1.start();
        boolean stopFlag = false;
        try
        {
            while (stopFlag == false)
            {
                Thread.sleep(1000);
                //stopFlag = readFromFile();
            }
            t1.interrupt();
        }
        catch (Exception e)
        {
            System.out.println("Exception handled " + e);
        }

    }
}

答案 1 :(得分:0)

目前我能想到的唯一方法是使用Socket并让另一个单独的流程向您的客户发送操作。换句话说,您将拥有服务器 - 客户端连接。试试this tutorial

答案 2 :(得分:0)

比阅读文件更简单的方法是,您可以使用exists()检查文件是否存在。

File stopFile = new File(System.getProperty("StopFile"));

while (!stopFile.exists()){

当然,您可能希望在循环后删除此文件。

stopFile.delete();

答案 3 :(得分:0)

我还建议像Monoteq提出的套接字。如果你不想使用套接字我不会读取文件并扫描内容,而只是测试是否存在。这应该可以提高性能。

File f;
while((f= new File(args[4] != null ? args[4] : System.getProperty("StopFile"))).exists()) {
    doSomething();
}
f.delete();

仍然不是最美丽的解决方案,但比阅读文件内容更好。