【问题标题】:Java Concurrency: Can I create a pool using worker threadJava并发:我可以使用工作线程创建一个池吗
【发布时间】:2011-08-27 12:40:44
【问题描述】:

我是 java.uti.concurrent 包的新手。我正在尝试使用ExecutorService 开发一个套接字侦听器类。这是我的主要代码 sn-p:

    while (!getExit()) {

        try{
            logger.info("RequestListner.run(): listening for new request...");
            Socket socket = server.accept();
            logger.info("RequestListner.run(): got new request");
            MyTask task = new MyTask(socket);
            pool.submit(task);
            logger.info("RequestListner.run(): submitted new request to pool");
        }catch(Exception e) {
            logger.error("RequestListner.run(): Exception: "+e.getMessage());
        }
    }

我的MyTask 类有一个ExecutorService 对象,它将提交MyTask2 任务。 (我的意图是为我的每个套接字连接执行多线程处理)

我的应用程序正在接受我的套接字客户端请求并创建MyTask2 池,执行良好。但是只有在完成我的第一个请求后才接受我的第二个套接字客户端连接。

谁能告诉我如何解决这个问题。

提前致谢。

-文卡特帕帕纳

【问题讨论】:

  • 你在MyTask构造函数中做了什么会阻塞的事情吗?
  • 谢谢@SimonJ,我找到了问题。在我的 MyTask 构造函数中,我正在调用内部调用 Future 的 get() 方法的 run() 方法。非常感谢 SimonJ。

标签: java concurrency java.util.concurrent


【解决方案1】:

你创建了什么样的Executor或ExecutorService?

public static final POOL_SIZE = 5;
ExecutorService exec = Executors.newFixedThreadPool(POOL_SIZE);

【讨论】:

  • 嗨,Ammar,是的,我在我的 Main 程序中只创建 Executors.newFixedThreadPool pool = Executors.newFixedThreadPool(POOLSIZE);,就像在我的 MyTask 程序中一样。
【解决方案2】:

您无需创建 ExecutorService 的“池”,只需使用一个 ExecutorService,它自己在内部管理一个线程池。

而且您的 ExecutorService 实现应该能够并行执行给定数量的任务。例如,在其中使用 Executors.new*ThreadPool() 方法并相应地对其进行参数化。

【讨论】:

  • 嗨 Suraj,我实际上只创建了一个 ExecutorService 对象。 ExecutorService pool;
  • 好酷..我看到你已经编辑了你的问题......你能告诉我你是如何创建你的执行者服务的
  • 我在我的Main 和MyTask 程序中使用pool = Executors.newFixedThreadPool(POOLSIZE);。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多