gpt4 book ai didi

java - Java 服务器中的执行程序池

转载 作者:行者123 更新时间:2023-11-28 23:35:55 25 4
gpt4 key购买 nike

我有一个 java 服务器,它正在处理客户端请求的网页中的图像。

现在处理这些图像需要时间和内存,并且处理图像的 n 个线程会挂起服务器。

现在为了避免处理图像的代码出现这种情况,我将它们放在一个 Runnable 类中并从执行程序池中调用它们。

我的问题是以下实现是否是在服务器中执行执行程序池的正确方法。

Runnable 类是 -

public class MyRunnable implements Runnable {
private final String id;

MyRunnable(String tid) {
this.id = tid;
}

@Override
public void run() {
NewAlbumImage nai = new NewAlbumImage();
nai.save_image(id,false);
}
}

运行 Runnable 类的代码如下 -

newa.NewClass newca = new newa.NewClass();
Runnable mr = new MyRunnable(id);
newca.executor.execute(mr);

类 NewClass 有一个静态执行器变量 -

static ExecutorService executor;

我在 web 应用程序启动时初始化 executor 变量,并在 web 应用程序关闭时销毁它 -

public class AppNameServletContextListener implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Initializing Executor Pool");
NewClass nc = new NewClass();
nc.executor = Executors.newFixedThreadPool(10);


}

@Override
public void contextDestroyed(ServletContextEvent sce) {
NewClass nc = new NewClass();
nc.executor.shutdown();
try {
nc.executor.awaitTermination( 10L, TimeUnit.MINUTES);
} catch (InterruptedException ex) {
System.out.println("Executor Pool await Termination exception");
}
}
}

最佳答案

有些事情我会考虑。

首先,您的执行器是静态的。我会使用某种依赖注入(inject)框架在需要的地方正确注入(inject)你的执行程序。或者将其作为属性添加到您的 servlet 上下文中,并在 servlet 初始化时自行注入(inject)。

使用 ServletContext 创建/关闭:

@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
context.setAttribute("executor", Executors.newCachedThreadPool());
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
ExecutorService executor = (ExecutorService)context.getAttribute("executor");
executor.shutdown();
}

其次,您使用的是固定线程池。这是一个可能的瓶颈(但也许是故意节省 CPU?)。如果无法同时调整超过 10 张图像的大小,那也没关系。但是,如果处理它们的速度比请求传入的速度慢,您会发现固定线程池将无法工作。事实上,如果您的应用程序加入调整大小任务以响应用户,则您已将任何给定时刻可能的请求数限制为定义的线程数。尝试使用缓存线程池。线程按需创建并因不活动而死亡。

Executors.newCachedThreadPool();

最后,我认为这更重要,您的应用程序将如何扩展?您拥有的用户越多,将在您的网络服务器上处理的图像就越多。您的响应时间将很快下降。只要三个用户同时尝试调整图像大小,就可能会占用您 100% 的 CPU。我建议将调整大小的图像外包到另一台机器上,一台能力更强的机器。

关于java - Java 服务器中的执行程序池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24656962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com