我应该使用Executor只运行1个Runnable吗?何时使用遗嘱执行人?

时间:2014-03-09 06:36:31

标签: java multithreading client-server runnable executor

我正在制作服务器,服务器为每个连接的客户端创建一个线程。该线程将有一个开放的输入流,它将监视传入的消息。对于此示例,该线程的Runnable将被称为ServerListenerRunnable。

我是否使用Executor或直接运行该线程存在冲突。

例如

Runnable listener = new ServerListenerRunnable();
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(listener);

这是否比运行

更好
new Thread(new ServerListenerRunnable()).start();

你能告诉我为什么吗?

如果你有时间杀人,你能解释为什么使用Executor比直接运行线程更好,反之亦然。

提前谢谢。

4 个答案:

答案 0 :(得分:1)

即使您只在整个程序中使用一个Runnable,最好还是使用Executor,原因很简单:它的代码数量大致相同,而且您是否想要更改程序,你已经完成了线程部分。

所以你除了获得灵活性之外什么都没有。灵活性 - 如果你在专业水平上工作 - 最有价值的东西。因为总有那一天,你老板突然冲进你的房间并要求最后一刻改变。优秀的程序员为此做好准备,糟糕的程序员取消他们的晚间计划。 ;)

答案 1 :(得分:0)

即使它是单线程执行程序,它也可以使用同一个线程执行多个任务。使用第二个选项,我们需要为每个任务创建一个效率较低的新线程。

答案 2 :(得分:0)

我认为你主要担心的是为什么执行器框架比使用thread更好.Below para形式在java书中思考给出了完美的解释

  

Java SE5 java.util.concurrent执行器简化了并发   通过管理Thread对象进行编程。执行人员提供了   客户端与任务执行之间的间接层;   而不是直接执行任务的客户端,中间对象   执行任务。执行程序允许您管理执行   异步任务,而无需显式管理生命周期   线程。执行程序是启动任务的首选方法   Java SE5 / 6

我们不会因为不推荐使用kill()方法而杀死线程,并且在JDK 8中不可用。 为了停止处理,我们向线程发送中断。在线程方法Using thread.interrupt()和执行器框架using shutdownnow()然后我们在run()方法中处理中断以使其出来。

此外,我不知道线程是首选方法的任何情况。让我们看看有人在我们更喜欢线程执行程序时发布任何示例。

答案 3 :(得分:0)

正如我的评论中所提到的,您首先要确定您的用例是否会从线程服务器中获益。它不是处理多个客户端的唯一方法:) 有关目前Web服务器实现的两种主流方法的讨论,请参阅示例this blog entry

现在,假设您决定使用线程,并回到原来的问题;在我看来,您的服务器管理(创建)线程,现在您只是在考虑如何调用线程应该执行的逻辑。因此,在非常真实的意义上,您的服务器是执行程序,您只需滚动自己的实现,而不是使用提供的。

如果我的假设是正确的,那么通过 SingleThreadExecutor 执行Runnable绝对是过于复杂它,因为现在你的服务器必须管理执行者(而不是一个线程) ),所以你引入了一个抽象层次,没有明显的收益。除非您看到可能性,即将来可能必需,否则您需要为每个客户端生成多个线程我会建议不要强>

相反,让您的服务器扩展或委托给具有固定线程池大小的Executor ,并将其传递给Runnable。这样您就可以从Java Concurrency API中获益。