atm我正在使用内部线程来调用方法。此方法可以抛出异常。有没有办法在外部类中接收Exception以对其做出反应? 或者我应该写一个“workthread”并添加一个观察者?
我实现了一个MVC模式。这个方法在我的模型中调用。现在我想显示一个关于异常的消息。因此我需要知道异常。
public void startServer(final String path, final int port, final double speedup) {
serverIsStopped = false;
new Thread() {
public void run() {
server = new SWTimeServer();
try{
server.startServer(port, speedup, path);
}catch (ClientDisconnectedException e) {
serverIsStopped = true;
//TODO
} catch (ParseException e) {
serverIsStopped = true;
//TODO
}
}
}.start();
}
我提出了这个快速解决方案。但非常难看。你的意见?
private boolean serverIsStopped = true;
private Model model = this;
public void startServer(final String path, final int port, final double speedup) {
serverIsStopped = false;
new Thread() {
public void run() {
server = new SWTimeServer();
try{
server.startServer(port, speedup, path);
}catch (ClientDisconnectedException e) {
serverIsStopped = true;
model.notifyObservers(e);
} catch (ParseException e) {
serverIsStopped = true;
model.notifyObservers(e);
}
}
}.start();
}
感谢您的回答
问候 Tarken
答案 0 :(得分:3)
你的问题没有意义。
您的线程(主要)在调用方法(创建线程)完成后运行。
将线程中抛出的异常传播到外部方法是没有意义的。
答案 1 :(得分:1)
您无法从线程B接收线程A中的异常,其中包含您通常使用的任何基本try / catch结构。如果你想做类似的事情,你将不得不实现一些类型的线程间消息/信令。
除了这个建议之外,没有更完整的解释你究竟想要做什么,我没有多少帮助。
答案 2 :(得分:1)
通过某个类实现Thread.UncaughtExceptionHandler
并将其分配给您的线程,这将允许您接收线程中抛出的异常。
Thread t = new Thread() {
.....
};
t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
void uncaughtException(Thread t, Throwable e) {
// Handle exception
}
});
答案 3 :(得分:0)
我没有使用线程进行太多开发,但是你不能通过存储异常并加入主线程来对异常做出反应吗?
public void startServer(final String path, final int port, final double speedup) {
serverIsStopped = false;
Thread thread = new Thread() {
Exception e;
public void run() {
server = new SWTimeServer();
try{
server.startServer(port, speedup, path);
}catch (ClientDisconnectedException e) {
serverIsStopped = true;
//TODO
this.e = e;
} catch (ParseException e) {
serverIsStopped = true;
//TODO
this.e = e;
}
}
}.start();
// the main thread will wait here until the new thread terminates
thread.join();
if (thread.e != null) {
// do stuff
}
}
答案 4 :(得分:0)
我会自己建议在这里应用观察者/可观察模式。虽然,你必须(松散地)将“worker / executor”线程对象与观察者耦合,但它会导致代码更清晰,你可以通过观察者抛出必要的异常
这种方法只有问题,你不知道调用线程处于什么状态,因此,是否会从观察者的异常中采取任何动作。虽然,您可以记录异常(或存储它),以便以后通过主线程进行检索,如果再次调度它。
希望这有帮助