Java多线程-主线程已停止

时间:2018-12-11 07:56:30

标签: java multithreading

我有一个Java应用程序,可从IoT设备读取数据。例如,我有一个智能体温计:

public class Thermometer{

    private final String ip;

    public Thermometer(String ip) {
        this.ip = ip;
    }

    public void startReading () {
        Thread readThread = new Thread(() -> {
            while (true) {
                try {
                    //reading, writing data to DB
                } catch (Exception e) {
                    //logging
                }
            }
        });
        readThread.start();
    }
}

在我的主要设备中,我添加所有IoT设备并启动其读取线程:

new Thermometer("192.168.1.100").startReading();
new Thermometer("192.168.1.101").startReading();

过一会儿(上一次我尝试了大约12个小时),我的主线程停止了,所以我所有的线程也都停止了。 我的日志文件(log4j2)具有以下内容:

com.foo.Main - null

可能是完整的堆栈跟踪信息已打印到sys.err。我将尝试抓住它并更新帖子。

为什么会发生?我该如何启动所有线程以便它们永远运行?

UPD。主班:

public class Main {

    public static void main(String[] args) {
        new Thermometer("192.168.1.100").startReading();
        new Thermometer("192.168.1.101").startReading();
    }
}

UPD2。起始脚本:

nohup java -Dlog4j.configurationFile=$PATH_TO_LOG4J2_XML -jar $PATH_TO_REEVE_JAR >> /home/buger/reeve/nohup.log 2>>&1 &
echo $! > $PATH_TO_PID
echo_and_log "Successfully started! PID = `cat $PATH_TO_PID`"

1 个答案:

答案 0 :(得分:1)

我认为您的阅读器线程发生了某些事情。也许是 exceptions ,achem,一个Error杀死了他们。我建议您调试一下。

同时,这是一个示例代码,可以证明我的理论:

public class Main {

    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("--> thread 1");
            }
        });
        Thread thread2 = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("--> thread 2");
            }
        });
        thread1.start();
        thread2.start();
        System.out.println("--> main thread about to finish");
    }

}

这将产生以下输出:

--> main thread about to finish
--> thread 2
--> thread 1
--> thread 1
--> thread 2
...