首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExecutorService设计模式

ExecutorService设计模式
EN

Stack Overflow用户
提问于 2014-10-12 10:57:06
回答 2查看 5.1K关注 0票数 1

我有一个java应用程序,它必须作为Linux进程运行。它通过套接字连接到远程系统。我有两个线程,贯穿整个程序的生命周期。这是我的应用程序入口点的简短版本:

代码语言:javascript
复制
public class SMPTerminal {
    private static java.util.concurrent.ExcecutorService executor;

    public static void main(String[] args) {
        executor = Executors.newFixedThreadPool(2);
        Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownHook()));
        run(new SMPConsumer());
        run(new SMPMaintainer());
    }

    public static void run(Service callableService) {
        try {
            Future<Callable> future = executor.submit(callableService);
            run(future.get().restart());
        } catch (InterruptedException | ExcecutionException e) {
            // Program will shutdown
        }
    }
}

这是Service接口:

代码语言:javascript
复制
public interface Service() {
    public Service restart();
}

这是Service接口的一个实现:

代码语言:javascript
复制
public class SMPConsumer implements Callable<Service>, Service {
    @Override
    public Service call() throws Exception {
        // ...
        try {
            while(true) {
                // Perform the service
            }
        } catch (InterruptedException | IOException e) {
            // ...
        }
        return this; // Returns this instance to run again
    }
  public Service restart() {
      // Perform the initialization
      return this;
  }
}

当暂时的IO故障或其他问题导致我的应用程序关闭时,我达到了这个结构。现在,如果我的程序遇到问题,它不会完全关闭,而是从头开始初始化并继续运行。但我认为这有点荒唐,我违反了OOP的设计规则。我的问题

  • 这种处理故障是正确的还是有效的?
  • 我将来可能会遇到什么问题?
  • 我是否需要为我的问题研究任何特殊的设计模式?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-13 07:48:26

您可能没有注意到,但是run方法在callableService返回之前等待它完成执行。因此,您不能同时启动两个服务。这是因为 waits until the task computation completes

代码语言:javascript
复制
public static void run(Service callableService) {
    try {
        Future<Callable> future = executor.submit(callableService);
        run(future.get().restart()); // <=== will block until task completes!
    } catch (InterruptedException | ExcecutionException e) {
        // Program will shutdown
    }
}

(您应该注意到,由于必须捕获InterruptionException --它表明存在一些阻塞、长时间运行的操作)。

这也使执行服务变得无用。如果向执行器提交任务的代码总是等待任务完成,则不需要通过executor执行此任务。相反,提交代码应该直接调用服务。

所以我假设在这种情况下阻塞不是整数的。也许您的run方法应该如下所示:

代码语言:javascript
复制
public static void run(Service callableService) {
    executor.submit(() -> {
        Service result = callableService.call();
        run(result.restart());
        return result;
    });
}

此代码段只是基本代码段,您可能希望将其扩展到处理异常情况。

票数 1
EN

Stack Overflow用户

发布于 2014-10-12 11:30:58

  • 这种处理故障是正确的还是有效的?这取决于应用程序的上下文和如何使用错误处理。
  • 可能遇到I/O故障等处理不当的情况。
  • 看来您已经在使用Adapter类型设计模式了。看看适配器设计模式http://www.oodesign.com/adapter-pattern.html
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26324407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档