如何在tomcat中确定特定线程的优先级

时间:2010-08-10 16:29:03

标签: java multithreading tomcat

我正在为tomcat6开发一个Java Web应用程序,它提供了建议功能。这意味着用户输入自由文本并获得完成输入的建议。 Web应用程序必须非常快速地做出反应才有意义。

此Web应用程序为可以随时修改的数据提供建议。如果有新数据可用,则会在守护程序线程的帮助下在后台创建全新的建议索引。如果数据准备过程完成,旧索引将被丢弃,新索引将发挥作用。这提供了没有服务差距的优势。

数据准备的后台进程会耗费大量CPU资源。这会导致服务有时挂起超过一秒钟,这会降低服务的可用性并导致糟糕的用户体验。

我首次尝试解决问题的方法是在必须处理请求时暂停所有后台数据准备线程。这种尝试稍微缩小了问题,但服务仍然不顺畅。并不是用于生成建议本身的代码片段变得更慢,但似乎 tomcat不会立即启动该请求的线程因为其他线程中的高负载(I猜)

我不知道如何面对这个问题。我可以与tomcat的线程调度程序进行交互并告诉他强制执行请求吗?正如预期的那样调整线程优先级也没有帮助。我没有找到提供帮助的tomcat的配置选项。或者没有办法解决这个问题,我必须修改软件概念?我很无奈。你对我如何面对这个问题有任何暗示吗?

JanP

1 个答案:

答案 0 :(得分:1)

我不会改变线程优先级,通过这样做,你正在减慢其他线程,并将减慢其他用户。如果您有同步数据,那么您将遇到优先级反转问题,其中较快的线程正在等待较低优先级的线程以释放数据锁。

相反,我会看看如何优化数据生成过程。你在那做什么?

编辑:

您可以创建一个ExecutorService并通过Queue向它发送消息,如下例所示:java thread pool keep running为了能够更改任务的Thread优先级而不是调用ExecutorService pool = Executors.newFixedThreadPool(3 );你将创建一个ThreadFactory然后让ThreadFactory降低线程的优先级,然后调用ExecutorService pool = Executors.newSingleThreadExecutor(threadFactory);

相关问题