0

我正在我的程序中编写一个线程池实用multithreading程序。我只需要验证以下方法是否正确,它们是否为我返回正确的值。我使用的是LinkedBlockingQueue大小为 1 的 a。我还参考了 java 文档,它总是说“方法将返回近似的”数字短语。所以我怀疑以下天气条件是否正确。

public boolean isPoolIdle() {
    return myThreadPool.getActiveCount() == 0;
}

public int getAcceptableTaskCount() {
    //initially poolSize is 0 ( after pool executes something it started to change )
    if (myThreadPool.getPoolSize() == 0) {
        return myThreadPool.getCorePoolSize() - myThreadPool.getActiveCount();
    }
    return myThreadPool.getPoolSize() - myThreadPool.getActiveCount();
}

public boolean isPoolReadyToAcceptTasks(){
    return myThreadPool.getActiveCount()<myThreadPool.getCorePoolSize();
}

请让我知道您的想法和建议。

更新

有趣的是,如果池返回我,则该getAcceptableTaskCount方法有 3 个线程可用,当我将 3 个任务传递给池时,有时一个任务被拒绝,它由RejectedExecutionHandler. 有时池会处理我通过的所有任务。我想知道为什么池被拒绝任务,因为我根据可用线程数传递任务。

--------- 灰色答案的执行---

class MyTask implements Runnable {

@Override
public void run() {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("exec");
}

}

@Test
public void testTPool(){

    ExecutorService pool = Executors.newFixedThreadPool(5);

    List<Future<MyTask>> list = new ArrayList<Future<MyTask>>();

    for (int i = 0; i < 5; i++) {
        MyTask t = new MyTask();
        list.add(pool.submit(t, t));
    }

    for (int i = 0; i < list.size(); i++) {

        Future<MyTask> t = list.get(i);

        System.out.println("Result -"+t.isDone());

        MyTask m = new MyTask();

        list.add(pool.submit(m,m));
    }
}

这将在控制台中打印Result -false,表示任务未完成。

4

1 回答 1

0

从您的评论中:

我需要知道池是否空闲或池是否可以接受任务。如果池可以接受,我需要知道池中有多少空闲线程。如果是 5,我将发送 5 个任务到池中进行处理。

我认为您不应该自己进行池核算。对于您的线程池,如果您使用Executors.newFixedThreadPool(5),那么您可以提交任意数量的任务,并且它只会在 5 个线程中运行它们。

所以我从向量中获取前 5 个任务并将它们分配给池。忽略向量中的其他任务,因为它们可能会从单独的循环中更新/删除

好的我明白了。所以你想最大化并行化,同时又不想预加载作业?我认为类似以下伪代码的东西会起作用:

  int numThreads = 5;
  ExecutorService threadPool = Executors.newFixedThreadPool(numThreads);
  List<Future<MyJob>> futures = new ArrayList<Future<MyJob>>();
  // submit the initial jobs
  for (int i = 0; i < numThreads; i++) {
      MyJob myJob = getNextBestJob();
      futures.add(threadPool.submit(myJob, myJob));
  }
  // the list is growing so we use for i
  for (int i = 0; i < futures.size(); i++) {
      // wait for a job to finish
      MyJob myJob = futures.get(i);
      // process the job somehow
      // get the next best job now that the previous one finished
      MyJob nextJob = getNextBestJob();
      if (nextJob != null) {
         // submit the next job unless we are done
         futures.add(threadPool.submit(myJob, myJob));
      }
  }

但是,我不太明白线程数会如何变化。如果您使用更多详细信息编辑您的问题,我可以调整我的回复。

于 2012-05-01T13:45:53.590 回答