相关疑难解决方法(0)

在webapp中正常关闭ExecutorService?

在我的webapp中,我创建了一个ExecutorService使用固定大小的ThreadPool的服务.我ExecutorService在整个应用程序生命周期中重复使用它.

private static ExecutorService pool = Executors.newFixedThreadPool(8);
Run Code Online (Sandbox Code Playgroud)

所有都在Tomcat中运行,它在向下发出错误时给出了以下错误:

appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak.
Run Code Online (Sandbox Code Playgroud)

我确实意识到我需要在关闭tomcat之前关闭ExecutorService.Soms SO线程已经谈到了这一点,但我找不到一个干净的方法来处理这个问题.

我是否应该ShutdownHook线程和执行程序的正常关闭中使用@ Tim-bender ?或者我应该使用CachedThreadPool吗?

java multithreading executorservice tomcat6

23
推荐指数
2
解决办法
7095
查看次数

预初始化工作线程池以重用连接对象(套接字)

我需要在Java中构建一个工作池,每个工作者都有自己的连接套接字; 当工作线程运行时,它使用套接字但保持打开以便以后重用.我们决定使用这种方法,因为与临时创建,连接和销毁套接字相关的开销需要太多的开销,所以我们需要一种方法,通过这种方法,工作池预先初始化了它们的套接字连接,准备好在保持套接字资源不受其他线程影响的同时承担工作(套接字不是线程安全的),所以我们需要这些内容......

public class SocketTask implements Runnable {
  Socket socket;
  public SocketTask(){
    //create + connect socket here
  }

  public void run(){
    //use socket here
  }
Run Code Online (Sandbox Code Playgroud)

}

在应用程序启动时,我们想要初始化工作程序,并希望套接字连接在某种程度上......

MyWorkerPool pool = new MyWorkerPool();
for( int i = 0; i < 100; i++)
   pool.addWorker( new WorkerThread());
Run Code Online (Sandbox Code Playgroud)

当应用程序请求工作时,我们将任务发送到工作池以立即执行...

pool.queueWork( new SocketTask(..));
Run Code Online (Sandbox Code Playgroud)


更新了工作代码
根据Gray和jontejj的有用评论,我有以下代码工作...

SocketTask

public class SocketTask implements Runnable {
    private String workDetails;
    private static final ThreadLocal<Socket> threadLocal = 
           new ThreadLocal<Socket>(){
        @Override
        protected Socket initialValue(){
            return new Socket();
        }           
    };

    public SocketTask(String details){ …
Run Code Online (Sandbox Code Playgroud)

java concurrency thread-local threadpool threadpoolexecutor

14
推荐指数
2
解决办法
7123
查看次数

如果其中一个抛出异常,如何停止所有正在运行的线程?

在我的一个应用程序中,我正在使用ExecutorService该类创建一个固定的线程池并CountDownLatch等待线程完成.如果进程没有抛出任何异常,这工作正常.如果任何线程中发生异常,我需要停止所有正在运行的线程并将错误报告给主线程.任何人都可以帮我解决这个问题吗?

这是我用于执行多个线程的示例代码.

    private void executeThreads()
    {
        int noOfThreads = 10;
        ExecutorService executor = Executors.newFixedThreadPool(noOfThreads);     
        try      
       {
        CountDownLatch latch = new CountDownLatch(noOfThreads);
        for(int i=0; i< noOfThreads; i++){
         executor.submit(new ThreadExecutor(latch));
        }
        latch.await();           
       }
       catch(Exception e)
       {
        e.printStackTrace();
       }
       finally
       {
        executor.shutDown();
       }
   }
Run Code Online (Sandbox Code Playgroud)

这是Executor类

     public class ThreadExecutor implements Callable<String> {
        CountDownLatch latch ;
        public ThreadExecutor(CountDownLatch latch){
            this.latch = latch;
        }   

    @Override
    public String call() throws Exception
    {
        doMyTask(); // process logic goes here!
        this.latch.countDown();
        return "Success";
    }
Run Code Online (Sandbox Code Playgroud)

================================================== …

java multithreading

11
推荐指数
2
解决办法
9009
查看次数

删除石英相关代码后,tomcat服务器中的内存泄漏错误

我正在开发基于spring hibernate的web项目.我使用c3p0进行连接池化.有时服务器会自动停止并显示

"Web应用程序注册了JDBC驱动程序但未能注销"

.还有以下错误.

"Web应用程序似乎已启动DefaultQuartzSchelduler_Worker_1但未能停止" 在此输入图像描述

在我的项目中删除了与Quartz作业相关的代码之后,仍然会出现此错误.我已关闭导致内存泄漏的所有流,但我仍然不知道为什么会发生这种情况.请帮我解决这个问题因为项目正在进行中.谢谢

java spring hibernate jdbc quartz-scheduler

5
推荐指数
0
解决办法
1688
查看次数

在Java中关闭ExecutorService的最佳方法

我正在尝试用Java编写异步编程,我正在使用ExecutorService创建一个由多个线程支持的池来提交多个可调用任务,但我对如何关闭ExecutorService几乎没有疑问.

这是我的原始代码:

ExecutorService executorService = Executors.newFixedThreadPool(10);

Future<String> f = executorService.submit(() -> {/*do something*/});

executorService.shutdown();

String result = f.get();
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

这很好用,执行程序在线程完成后关闭.但我很担心如果写出错误的话,可调用任务中的代码 f.get()将永远占用,程序将永远停止并永不退出.

有了担心,这是我的第二次尝试:

ExecutorService executorService = Executors.newFixedThreadPool(10);

Future<String> f = executorService.submit(() -> {/*do something*/});

executorService.shutdown();

if(!executorService.awaitTermination(10, TimeUnit.SECONDS)){
    executorService.shutdownNow();
}

String result = f.get();
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,我可以确保线程在10秒后关闭.但实际上程序被阻止了10秒,线程可能只用了5秒钟.

我的问题是如何设置强制关闭池中的线程的时间,以便我不需要显式使用awaitTermination来阻止程序.

java multithreading

5
推荐指数
1
解决办法
803
查看次数

使用多线程处理对Java数组进行分区和分析

我必须通过for循环初始化一个浮点[12000] 12000次.然后我扫描数组以查找超过特定阈值的值.如果值超过阈值,我操纵某个对象的实例变量.

例:

Random random = new Random();
float[] x = new float[12000];

for (int i = 0; i < x.length; i++) {
  x[i] = random.nextFloat();
}

for (int i = 0; i < x.length; i++) {
  if (x[i] >= 0.75) {
  \\ do something interesting
  }
}
Run Code Online (Sandbox Code Playgroud)

基本上,我必须更改数组的值,并在每次长度为12000时在新数组上执行12000次."有趣的"代码只是在另一个数据结构中查找该索引并调用setter.根据我的系统时间计算,我需要大约13个小时.我的机器上有8个处理器.

如何利用java的多线程功能?我特意寻找分区初始化和扫描数组的线程解决方案.使用线程的源代码将不胜感激.

java arrays multithreading

3
推荐指数
1
解决办法
6743
查看次数