【问题标题】:New Task is not being picked up by a thread once it is done with the first one and goes in wait state for forever新任务一旦完成第一个任务并永远处于等待状态,就不会被线程拾取
【发布时间】:2012-11-16 05:16:55
【问题描述】:

示例代码:

public class ThreadTest{

    public static void main(String ...arg){
           try{
                ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
                for(int i=0; i < noOfTask; i++){
                    executor.execute(new ImplRunnable(connectionPool.getConnection()));
                }
                executor.shutdown();
                //Wait for all threads completion
               executor.awaitTermination(100, TimeUnit.MICROSECONDS);
            }catch(Exception e){
              e.printStackTrace();
            }finally{
            //close database connections etc.
            }
        }
    }
    class ImplRunnable implements Runnable{
             private Connection conn;
              public ImplRunnable(Connection conn){
                     this.conn = conn;
              }

            public void run(){
                try{
                    for(int i =0; i < 1000000; i++){
                        counts++;
                    }

                }catch(Exception exception){
                    exception.printStackTrace();
                }finally{
                    //close all open statements
                    try{
                        conn.close();
                    }catch(Exception exp){
                        exp.printStackTrace();
                    }

                }
           }
        }

我的系统有 4 个核心,因此池大小为 4,我有 10 个任务要做

for 循环打开了 10 个线程,但同时运行了 4 个线程。但问题是当一个线程完成处理时,它会永远处于等待状态,而不是拿起下一个任务进行处理。上面的代码有什么问题?

请建议...

【问题讨论】:

  • 用executor.awaitTermination(60, TimeUnit.SECONDS) 替换while (!executor.isTerminated()) {} 有帮助吗?您的代码也无法编译(缺少Runnable 实现)。最后循环没有打开 10 个线程,它向池提交 10 个任务,有 4 个线程(所以 6 个将排队)。除了你的代码很好。
  • @TomaszNurkiewicz 感谢您的回复。我确实有 Runnable 的 impl 类。这只是示例代码...我会尝试上面提到的任何内容。
  • 嘿@TomaszNurkiewicz 看起来 executor.awaitTermination(60, TimeUnit.SECONDS) 比 while (!executor.isTerminated()) {} 快.. 为什么会这样?有什么想法吗?
  • 当然更快,它只是等待锁而不是忙于等待,主动循环并烧掉一个内核的 100%。
  • 我进行了更改,但问题仍然存在。我可以在控制台上看到所有线程的进入和退出语句,但是当所有线程都完成第一轮处理时,它们将进入等待状态永远不会被 ThreadPoolExecutor 接手执行下一个任务......有什么线索吗?

标签: multithreading threadpool


【解决方案1】:

只有当我从连接池为线程分配连接时,我才在线程完成处理时没有关闭它,这是我的错。当我在线程结束时关闭连接时,它开始工作并且线程被正确分配给下一个任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 2015-08-10
    • 2014-08-08
    相关资源
    最近更新 更多