Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该使用执行器只运行1个Runnable吗?何时使用遗嘱执行人?_Java_Multithreading_Client Server_Runnable_Executor - Fatal编程技术网

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

Java 我应该使用执行器只运行1个Runnable吗?何时使用遗嘱执行人?,java,multithreading,client-server,runnable,executor,Java,Multithreading,Client Server,Runnable,Executor,我正在创建一个服务器,服务器为每个连接的客户机创建一个线程。该线程将有一个开放的inputstream,它将监视传入的消息。在本例中,该线程的Runnable将被称为ServerListenerRunnable 我不知道是使用Executor还是直接运行线程 比如说 Runnable listener = new ServerListenerRunnable(); Executor executor = Executors.newSingleThreadExecutor(); executor.

我正在创建一个服务器,服务器为每个连接的客户机创建一个线程。该线程将有一个开放的inputstream,它将监视传入的消息。在本例中,该线程的Runnable将被称为ServerListenerRunnable

我不知道是使用Executor还是直接运行线程

比如说

Runnable listener = new ServerListenerRunnable();
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(listener);
这比跑步好吗

new Thread(new ServerListenerRunnable()).start();
你能告诉我为什么吗

如果你有时间消磨时间,你能解释一下为什么使用Executor比直接运行线程好,或者相反


提前感谢。

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

我认为您主要关心的是为什么executor框架比使用线程更好。下面java书中的段落形式思想对此给出了完美的解释

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

我们不终止线程,因为kill()方法已被弃用,并且在JDK 8中不可用。 为了停止处理,我们向线程发送中断。在线程方法和执行器框架中,然后我们在run()方法中处理中断,以使其脱离


我也不知道线程是首选方法的任何情况。让我们看看当我们更喜欢线程而不是执行器时,是否有人发布了任何示例。

即使在整个程序中只使用一个可运行的,使用执行器还是更好,原因很简单:编写的代码量差不多,如果您想更改程序,您已经完成了穿线部分


所以你除了获得灵活性外什么都没有失去。如果你在专业水平上工作,灵活性是最有价值的。因为总有那么一天,你的老板冲进你的房间,要求在最后一刻做出改变。好的程序员会为此做好准备,坏的程序员会取消他们的晚间计划

正如我在评论中提到的,您首先应该确定您的用例是否从线程服务器中获益。这不是处理多个客户端的唯一方法:) 请参阅示例,了解目前关于web服务器实现的两种主流方法的讨论

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

如果我的假设是正确的,那么通过SingleThreadExecutor执行Runnable绝对是过于复杂的,因为现在您的服务器必须管理执行器(而不是线程),因此您引入了一个抽象级别,但没有明显的好处。除非您看到将来可能需要为每个客户端生成多个线程的可能性,否则我建议您不要这样做


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

以这种方式使用执行器并没有什么错,因为它给了您使用API的经验-imhow为什么您的服务器需要创建线程?也许一个更简单的方法(例如事件)可以完成任务?@OJKrylow如果我真的需要创建线程,你是什么意思?我需要用线程分别处理每个客户端。没有别的办法,除非我只想接受一个客户。你能解释一下你所说的事件式方法是什么意思吗?我正在制作一个类似于带有java的web服务服务器的东西,客户机可以在其中连接和检索数据。服务器也可以修改为聊天服务器。我很想知道是否有其他方法可以做到这一点。