Apache Tomcat说过很多次:
web应用程序[/MyServlet]似乎已启动名为[pool-61-thread-2]的线程,但未能停止该线程。这很可能会造成内存泄漏。
这样危险吗?servlet应该能够每天处理10.000个请求。如何关闭线程时,他们已经完成?
class Worker {
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
private final int threadNumber;
Worker(
CountDownLatch startSignal,
CountDownLatch doneSignal,
int threadNumber
){
this.startSignal = startSignal;
this.doneSignal = doneSignal;
this.threadNumber = threadNumber;
}
public String[][] getSomeStrArrArr() {
String[][] isRs = new String[8][20];
String[][] inRs = new String[8][20];
String[][] iwRs = new String[8][20];
try {
startSignal.await();
if (threadNumber == 1) {
// get String[][] result for thread number 1
isRs = getIS(erg1, erg2, request);
}
if (threadNumber == 2) {
// get String[][] result for thread number 2
inRs = getIN(search_plz, request);
}
if (threadNumber == 3) {
// get String[][] result for thread number 3
iwRs = getIW(erg1, erg2, request);
}
doneSignal.countDown();
} catch (InterruptedException ex) {
System.out.println(
"Thread number "+threadNumber+" has been interrupted."
);
}
if (threadNumber == 1) {
return isRs;
}
if (threadNumber == 2) {
return inRs;
}
if (threadNumber == 3) {
return iwRs;
}
return null;
}
public Callable<String[][]> getSomeCallableStrArrArr(){
return new Callable<String[][]>() {
public String[][] call() throws Exception {
return getSomeStrArrArr();
}
};
}
}
ExecutorService pool = Executors.newFixedThreadPool(3);
Set<Future<String[][]>> set = new HashSet<Future<String[][]>>();
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(3);
for (int i=1;i<=3;i++) {
Worker worker = new Worker(startSignal,doneSignal,i);
Callable<String[][]> callable =
worker.getSomeCallableStrArrArr();
Future<String[][]> future = pool.submit(callable);
set.add(future);
}
startSignal.countDown();
try {
doneSignal.await();
是的,这是个问题。如果代码启动了非守护进程线程,那么这些线程将继续工作,直到退出其run方法。即使其他一切都完成了,旧的JVM也会在这些线程继续运行时挂起。如果启动一个新实例,那么可能会出现旧线程仍与新实例创建的线程一起工作的情况。
任务的设计需要确保它们能够对中断做出响应(而不是像您的示例所示,吃掉异常并继续执行)。这意味着检查当前线程上的中断标志,并以一种有用的方式捕获InterruptedException,从而允许任务中断其工作,并在需要时重置中断标志。ExecutorService实现有一个Shutdownow方法,该方法将中断当前任务。
下面是一个如何使用中断停止线程的示例。
确保executor关闭,您可以在ServletContextListener中处理此问题。
问题内容: Apache Tomcat多次说: Web应用程序[/ MyServlet]似乎已启动名为[pool-61-thread-2]的线程,但未能停止它。这很可能造成内存泄漏。 这很危险吗?该servlet应该每天能够处理10.000个请求。完成后如何关闭线程? 问题答案: 是的,这是一个问题。如果您的代码启动非守护程序线程,则这些线程将继续工作,直到退出运行方法。即使其他一切都完成了,当这
我正在使用org.AsynchTtpClient发布异步请求。 在关闭tomcat时,我得到了以下日志: 严重:web应用程序[/test]似乎启动了一个名为[pool-1-thread-1]的线程,但未能停止它。这很有可能造成内存泄漏。 2017年7月4日10:53:00 AM org.apache.catalina.loader.webappclassloaderbase clearRefer
我们在ReentantLock上调用“lock()”,线程卡在那里,而它们显然不应该卡在那里。 在调用“lock()”之前使用断点进行调试时,第一个线程将停止在那里,程序指针将指向“thread.exit()”。lock对象的toString()表示“unlocked”,其“state”属性为“0”。行为并不总是一样的。有时,第一个线程会像预期的那样通过锁。
我在log4j v1中面临内存泄漏的问题。如何解决这个内存泄漏问题。此方法是定期检查log4j.properties文件在我的类中的更新。 PropertyConfigutaror.ConfigureandWatch(time_ms); 但是在关机期间,tomcat内存泄漏问题就来了。日志如下: 提前致谢
当我们试图取消部署应用程序时,一些Oracle类似乎正在泄漏。在使用旧的OJDBC14.jar驱动程序时,我没有看到这种情况,但我们不能使用这些驱动程序,因为我们正在迁移到Oracle11g,这需要更新的驱动程序。我猜这是Oracle驱动程序中的bug?我能做些什么来清理这些资源吗?我尝试关闭数据库连接池和其他东西,但没有成功... 我不使用Tomcat的连接池会更好吗?我们宁愿让服务器连接到数据
问题 你要为需要并发执行的代码创建/销毁线程 解决方案 threading 库可以在单独的线程中执行任何的在 Python 中可以调用的对象。你可以创建一个 Thread 对象并将你要执行的对象以 target 参数的形式提供给该对象。 下面是一个简单的例子: # Code to execute in an independent thread import time def countdown(