我正在制作服务器,服务器为每个连接的客户端创建一个线程。该线程将有一个开放的输入流,它将监视传入的消息。对于此示例,该线程的Runnable将被称为ServerListenerRunnable。
我是否使用Executor或直接运行该线程存在冲突。
例如
Runnable listener = new ServerListenerRunnable();
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(listener);
这是否比运行
更好new Thread(new ServerListenerRunnable()).start();
你能告诉我为什么吗?
如果你有时间杀人,你能解释为什么使用Executor比直接运行线程更好,反之亦然。
提前谢谢。
答案 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中获益。