gpt4 book ai didi

java - 捕获异常后重新启动线程

转载 作者:行者123 更新时间:2023-11-30 03:42:05 25 4
gpt4 key购买 nike

我正在读取 UDP 源,并且希望线程在失败时尝试重新启动。我认为我已经正确地写了我的类(class),但希望有人检查一下,看看是否有遗漏的东西,或者我写了一些无法完成工作的东西。在我的 catch 子句中,我尝试每 6 秒重新启动一次线程,共进行 10 次尝试。这是一个好的解决方案吗?它会起作用吗?

class UDPReader extends Thread
{
private Thread t;
private final String ip, socket, queue, threadName;
private String ErrorMessage;
private final JTextArea screen;

UDPReader(String ip, String socket, String queue, String threadName, JTextArea screen) {
this.ip = ip;
this.socket = socket;
this.queue = queue;
this.threadName = threadName;
this.screen = screen;
}

public void run()
{
try {
byte[] i = null;
ipaddrConnection ipaddr = new ipaddrConnection(ip, socket);
parseUDP p = new parseUDP();

screen.append("Thread " + threadName + " running\n");
while(true)
{
i = ipaddr.getPacket();
p.parseUDP(i);
//Thread.sleep(0);
}
}
catch (IOException ex) {
Logger.getLogger(MarketDataReader.class.getName()).log(Level.SEVERE, null, ex);
ErrorMessage = "Thread " + threadName + " has failed, Attempting to Restart";
screen.append("Thread " + threadName + " has failed, Attempting to Restart\n");
Email email = new Email(ErrorMessage,"WARNING Market Data Reader Failure");

for(int i = 0; i < 10 && t.isAlive() == false; i++)
{
try {
start();
Thread.sleep(6000);
} catch (InterruptedException ex1) {
Logger.getLogger(UDPReader.class.getName()).log(Level.SEVERE, null, ex1);
ErrorMessage = "Thread " + threadName + " has failed, Contact System Administraitor";
screen.append("Thread " + threadName + " has failed, Contact System Administraitor\n");
email = new Email(ErrorMessage,"WARNING Market Data Reader Failure");
}
}
}
}

public void start()
{
if (t == null)
{
t = new Thread (this, threadName);
t.start ();
}
}
}

最佳答案

我不详细了解你的线程背后的逻辑,但我会对你的代码设计提出一些建议。

  1. 目前尚不清楚为什么在从线程派生的类中会有另一个线程 t。

  2. 没有必要从 Thread 派生(我认为这通常是一个不好的做法)。通常是实现 Runnable 接口(interface),然后使用它构造一个新线程。

.

class UDPReader implements Runnable {
...
}

然后实例化一个线程,如下所示:

Thread t = new Thread(new UDPReader());
  • 通常,如果线程失败,它就会终止...失败的线程“重新创建”自身看起来不太好。更好的解决方案是提供 Thread.UncaughtExceptionHandler 并在创建线程的代码中分析失败条件并在需要时重新启动线程。
  • 一般来说,为了避免困惑,在并发编程中,您必须清楚地区分线程的逻辑和管理该线程的外部逻辑(其启动/中断/终止)。我认为,这是您在代码中没有做的事情。

    关于java - 捕获异常后重新启动线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26613872/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com