Kis*_*ada 6 java concurrency multithreading executorservice
我是java中这个并发编程的新手,并提出了以下场景,我在混淆时使用它.
场景1:在下面的代码中,我试图通过在GPSService类上调用.start ()来运行线程,这是一个Runnable实现.
int clientNumber = 0;
ServerSocket listener = new ServerSocket(port);
while (true) {
new GPSService(listener.accept(), clientNumber++, serverUrl).start();
}
Run Code Online (Sandbox Code Playgroud)
场景2:在下面的代码中,我试图通过使用ExecutorService类来运行线程,如图所示
int clientNumber = 0;
ServerSocket listener = new ServerSocket(port);
while(true) {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new GPSService(listener.accept(), client++, serverUrl));
executor.shutdown();
while (!executor.awaitTermination(1, TimeUnit.SECONDS)) {
// Threads are still running
System.out.println("Thread is still running");
}
// All threads are completed
System.out.println("\nThread completed it's execution and terminated successfully\n");
}
Run Code Online (Sandbox Code Playgroud)
我的问题是
在并发编程中调用线程的最佳实践是什么?
当我使用第一个或第二个时,我会得到什么结果(麻烦)?
注意:我一直面临着第一个场景的问题,即每隔几天该程序就会被吊死.那么,当我使用第一种方法时,该问题是否与预期有关.
任何好的/有用的答案将不胜感激:)谢谢
除了在场景 2 中管理线程终止之外,您发布的两个场景没有太大区别;您总是为每个传入请求创建一个新线程。如果您想使用 ThreadPool,我的建议是不要为每个请求创建一个线程池,而是为每个服务器创建一个线程池并重用线程。就像是:
public class YourClass {
//in init method or constructor
ExecutorService executor = Executors....;// choose from newCachedThreadPool() or newFixedThreadPool(int nThreads) or some custom option
int clientNumber = 0;
ServerSocket listener = new ServerSocket(port);
while(true) {
executor.execute(new GPSService(listener.accept(), client++, serverUrl));
}
Run Code Online (Sandbox Code Playgroud)
这将允许您使用线程池并控制服务器使用的线程数量。如果您想使用执行器,这是首选方法。
对于服务器池,您需要决定池中有多少线程;您有不同的选择,但您可以使用固定数量的线程或尝试使用非繁忙线程的池来启动,如果所有线程都繁忙,则会创建一个新线程(newCachedThreadPool())。要分配的线程数量取决于许多因素:并发请求的数量及其持续时间。服务器端代码花费的时间越多,您需要的额外线程就越多。如果您的服务器端代码非常快,则池很有可能回收已分配的线程(因为请求并非全部在同一时刻到达)。
举例来说,您在一秒钟内有 10 个请求,每个请求持续 0.2 秒;如果请求到达第二个的 0, 0.1, 0.2, 0.3, 0.4, 0.5, .. 部分(例如 23/06/2015 7:16:00:00, 23/06/2015 7:16:00: 01, 23/06/2015 7:16:00:02)您只需要三个线程,因为来自 0.3 的请求可以由处理第一个请求(0 处的请求)的线程执行,依此类推(该请求在时间 0.4 可以重用用于在 0.1 到达的请求的线程)。由三个线程管理十个请求。
我建议您(如果您还没有读过)阅读《Java 并发实践》(任务执行是第 6 章);这是一本关于如何用 Java 构建并发应用程序的优秀书籍。
| 归档时间: |
|
| 查看次数: |
4200 次 |
| 最近记录: |