Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现具有固定大小任务列表的池_Java_Multithreading_Asynchronous_Concurrency_Threadpool - Fatal编程技术网

Java 实现具有固定大小任务列表的池

Java 实现具有固定大小任务列表的池,java,multithreading,asynchronous,concurrency,threadpool,Java,Multithreading,Asynchronous,Concurrency,Threadpool,我想创建一个简单的模拟,我需要一个线程池,所以我决定写一个。我的界面如下: public interface ThreadPool { public void start(); public int getTaskListSize(); public void addTask(Task task); public Task getNextTask(); } 最重要的是,任务列表的大小是有限的,当有人试图在任务已满的情况下向其中添加任务时,他会被阻止并等待该对象。

我想创建一个简单的模拟,我需要一个线程池,所以我决定写一个。我的界面如下:

public interface ThreadPool {
    public void start();
    public int getTaskListSize();
    public void addTask(Task task);
    public Task getNextTask();
}
最重要的是,任务列表的大小是有限的,当有人试图在任务已满的情况下向其中添加任务时,他会被阻止并等待该对象。然而,在我的实现中,想要获取NextTask的线程通过notifyAll调用彼此唤醒,这是不好的

   @Override
    public void addTask(Task task) {
        synchronized (tasks) {
            tasks.add(task);
            log("task list size:" + tasks.size());
        }

        synchronized (this) {
            notifyAll();
        }
    }

    @Override
    public Task getNextTask() {
        Task task;
        synchronized (tasks) {
            task = tasks.poll();
        }

        synchronized (this) {
            notifyAll();
        }

        return task;
    }
有没有一个干净的方法来解决这个问题?我使用ArrayBlockingQueue来保存任务

从线程调用addTask是:

protected void addTask(Task task, ThreadPool threadPool) {
    while (true) {
        try {
            log("trying to add " + task);
            threadPool.addTask(task);

            log("added " + task  +"!");
            return;
        } catch (IllegalStateException ex) {
            log("adding failed, waiting");
            synchronized(threadPool) {
                threadPool.wait()
            }
        }
    }
}

只是想知道:为什么要实现Java库中已经存在的东西?你是否研究了相应的课程,发现它们不是你所需要的?问这个问题是因为:通常情况下,Java附带的东西都是经过良好设计和测试的;那么,为什么要花时间重新发明轮子呢?因为我想深入了解东西是如何工作的。ArrayBlockingQueue是线程安全的,正如其名称所示,它是阻塞的。不需要在上面同步。不确定为什么getNextTask是公共的,以及notifyAll调用的用途。还有,你为什么要重新发明轮子?Java有一个线程池实现。notifyAll用于此线程池中的线程,因为它们位于线程池之外。实际上,我不必在数组上同步。阻塞队列将自动通知在getNextTask上阻塞的线程。一切都是无用的。顺便说一句,notifyAll用于提取在同一锁上的等待调用中被阻止的线程,并且代码中没有任何线程。