使用内部线程是明智的吗?如果是,如何提取异常?

时间:2011-06-21 21:25:07

标签: java

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

5 个答案:

答案 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
   }

});

http://download.oracle.com/javase/6/docs/api/java/lang/Thread.UncaughtExceptionHandler.html#uncaughtException(java.lang.Thread,%20java.lang.Throwable

答案 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”线程对象与观察者耦合,但它会导致代码更清晰,你可以通过观察者抛出必要的异常

这种方法只有问题,你不知道调用线程处于什么状态,因此,是否会从观察者的异常中采取任何动作。虽然,您可以记录异常(或存储它),以便以后通过主线程进行检索,如果再次调度它。

希望这有帮助