ThreadPoolExecutor с ArrayBlockingQueue

Я начал читать больше о ThreadPoolExecutor из Java Doc, поскольку я использую его в одном из своих проектов. Итак, может ли кто-нибудь объяснить мне, что на самом деле означает эта строка? - Я знаю, что означает каждый параметр, но я хотел понять это в более общем/непрофессиональном ключе от некоторых экспертов здесь.

ExecutorService service = new ThreadPoolExecutor(10, 10, 1000L,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10, true), new 
ThreadPoolExecutor.CallerRunsPolicy());

Обновлено: - Постановка проблемы:

Каждый поток использует уникальный идентификатор от 1 до 1000, и программа должна работать в течение 60 минут или более. Таким образом, за эти 60 минут возможно, что все идентификаторы будут завершены, поэтому мне нужно повторно использовать эти идентификаторы. снова. Итак, это программа ниже, которую я написал с помощью вышеуказанного исполнителя.

class IdPool {
    private final LinkedList<Integer> availableExistingIds = new LinkedList<Integer>();

    public IdPool() {
        for (int i = 1; i <= 1000; i++) {
            availableExistingIds.add(i);
        }
    }

    public synchronized Integer getExistingId() {
        return availableExistingIds.removeFirst();
    }

    public synchronized void releaseExistingId(Integer id) {
        availableExistingIds.add(id);
    }
}


class ThreadNewTask implements Runnable {
    private IdPool idPool;

    public ThreadNewTask(IdPool idPool) {
        this.idPool = idPool;
    }

    public void run() {
        Integer id = idPool.getExistingId();
        someMethod(id);
        idPool.releaseExistingId(id);
    }

// This method needs to be synchronized or not?
    private synchronized void someMethod(Integer id) {
        System.out.println("Task: " +id);
// and do other calcuations whatever you need to do in your program
    }
}

public class TestingPool {
    public static void main(String[] args) throws InterruptedException {
        int size = 10;
        int durationOfRun = 60;
        IdPool idPool = new IdPool();   
        // create thread pool with given size
        ExecutorService service = new ThreadPoolExecutor(size, size, 500L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(size), new ThreadPoolExecutor.CallerRunsPolicy()); 

        // queue some tasks
        long startTime = System.currentTimeMillis();
        long endTime = startTime + (durationOfRun * 60 * 1000L);

        // Running it for 60 minutes
        while(System.currentTimeMillis() <= endTime) {
            service.submit(new ThreadNewTask(idPool));
        }

        // wait for termination        
        service.shutdown();
        service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); 
    }
}

Мои вопросы: - Этот код верен с точки зрения производительности или нет? И что еще я могу сделать здесь, чтобы сделать его более точным? Любая помощь будет оценена.

5
задан arsenal 26 May 2012 в 23:28
поделиться