情况是这样,由于数据量庞大,项目组需要采用线程池管理多线程,来对数据库进行分批任务的查询,并且整个应用只能最多穷6个线程,这个问题的难点在于,当用户请求进入到action后,首先是否应该判断池里面还有没有空闲的线程,如果没有的话怎么办?? 等等。由于我对多线程不了解,跪求前辈们给出方案。最好能给出示例代码 谢谢了!

解决方案 »

  1.   

    我不理解为什么请求来了还要再去请求一个新的线程去处理?对于 HTTP 请求,每个请求都是一个线程,没有多大的必要再去创建一个。
      

  2.   

    我 不 知 道 你 们 的 线 程 池 的 实 现 是 什 么, 反 正 与 线 程 相 关, 再 与 池 相 关 的 话 问  题 就 会 变 得 极 其 复 杂, 如 果 没 有 相 关 经 验 的 话 更 是 难 上 加 难 了。可 以 先 去 看 一 下 java.util.concurrent.ThreadPoolExecutor 这 个 JDK 中 内 置 的 线 程 池 类 库。一 个 线 程 池 的 创 建 有 很 多 参 数, 比 如: 线 程 池 大 小, 等 候 队 列 大 小, 线 程 回 收 时 间, 线 程 工 厂, 以 及 线 程 池 关 闭 时 队 列 中 未 处 理 的 任 务 的 执 行 策 略, 等 等。另 外, 需 求 需 要 分 片 执 行, 那 就 需 要 有 一 个 合 并 数 据 的 阶 段, 这 个 可 以 看 一 下 JDK 中 一 个 称 为 倒 计 数 门 闩(java.util.concurrent.CountDownLatch)或 者 循 环 障 栅(java.util.concurrent.CyclicBarrier)这 两 个 同 步 器 的 API 文 档。你 们 这 样 的 需 求, 在 代 码 开 发 阶 段 就 这 么 进 行 优 化 实 际 上 是 很 不 可 取 的。 开 发 阶 段 应 注 重 扩 展 性 的 设 计, 也 就 是 说 设 计 比 优 化 更 重 要。 比 如 现 在 按 普 通 的 方 式 来 运 作, 若 今 后 出 现 性 能 问 题, 那 只 要 再 实 现 一 个 接 口 就 可 以 改 变 执 行 策 略 而 改 用 线 程 池 分 片 执 行 的 方 式。
    不好意思,上面的回复说“您的回复正文中有非法词或词组!”,不得已而为之
      

  3.   


    不用你去实现,JDK 中有自带的。让你自己实现是不可能的,在国内有这水平的人也是凤毛麟角!
      

  4.   

    火龙果大哥说的真好,java.util.concurrent.ThreadPoolExecutor 以及java.util.concurrent.CountDownLatch前一久项目中使用过,封装的很成熟灰常好用......
    我觉得LZ的问题完全可以采用先给数据库里面的数据建索引,再利用索引通过多线程查询来解决(以前项目中用的是lucene),让你自己写线程池很不现实