关机线程

问题描述:

我在tomcat上部署了一个web应用程序。在这个应用程序中有ExecutorService执行一些任务的并发执行。我的应用程序中也有一些使用Thread native的方法,如下所示执行并发执行。关机线程

new Thread(new Runnable() { 
public void run() { 
    //TODO: Perform some CRUD function 
} 
}).start(); 

当针对这些方法调用表单POST时,会启动线程并根据需要执行函数执行。我的问题是,这是一个很好的设计方法,还是必须在每次会话后关闭线程,或者在tomcat关闭以进行维护时关闭线程。请有人指点我正确的方向。

+0

出于好奇,你如何做交易处理? – mhaller 2010-12-15 10:43:17

+0

使用Hibernate3事务管理器 - 任何建议? – Bitmap 2010-12-16 08:59:27

我必须每个会话后关闭线程,还是我关闭线程当Tomcat关闭的发言权维护

我不太明白这个部分,而是创造新的随机数线程是一个坏主意,首先它很昂贵,其次它不可能创建任意数量的线程,迟早你会遇到内存不足的例外。更好地使用线程池。

+0

好 - 何时关闭线程池是理想的选择? – Bitmap 2010-12-15 09:54:51

+0

@Bitmap通常你不想在程序退出之前关闭池。正是因为关闭/重新创建游泳池将会导致性能处罚,并且不会在正常循环中给您带来任何好处。 – 2010-12-15 09:58:52

+0

@Victor Sorokin OIC - 所以我可以假设游泳池将一直活着,直到说tomcat正式关闭维护! – Bitmap 2010-12-15 10:01:52

创建和启动新线程是相当昂贵的操作。如果您关注性能,请采用Executors.newCachedThreadPool方法。
此外,如果您不需要担心线程限制耗尽的情况下使用某些Executors.newFixedThreadPool。请注意,如果用户数超过池中的线程数,则使用此类执行程序可能会导致用户延迟。但是,如果由任务执行的操作是短时间的,则用户几乎不会注意到延迟。

+0

默认情况下,Executors.newCachedThreadPool会为我执行启动和关闭功能吗? – Bitmap 2010-12-15 09:52:17

+0

@Bitmap Pool将在需要执行提交的任务('Runnable'或'Callable')时启动线程。池不会关闭线程,因为它们会被重用于您提交的新任务 - 这就是为什么它被称为池的原因;) – 2010-12-15 09:56:30

有两个问题的方法:

  1. 创建一个新的线程并不便宜。在客户端连接之间共享线程池是更好的方法
  2. 可能会对JVM可创建的并发线程数量施加限制。一旦达到此限制,新的客户端连接将被拒绝。

您可以通过使用java.util.concurrent包提供的设施来解决这些问题。详情请参阅this tutorial

+0

好吧!所以说我正在使用Executors.newFixedThreadPool(7),你认为什么时候关闭执行程序是理想的?如何在应用程序类中使单个ExecutorService对象可用! – Bitmap 2010-12-15 09:59:22