ThreadPoolExecutor mit ArrayBlockingQueue

Ich habe angefangen, mehr über ThreadPoolExecutor in Java Doc zu lesen, da ich es in einem meiner Projekte verwende. Kann mir jemand erklären, was diese Zeile eigentlich bedeutet? - Ich weiß, wofür jeder Parameter steht, aber ich wollte es von einigen Experten hier allgemeiner / laienhafter verstehen.

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

Aktualisierte:- Problemstellung ist: -

Jeder Thread verwendet eine eindeutige ID zwischen 1 und 1000 und das Programm muss 60 Minuten oder länger ausgeführt werden. In diesen 60 Minuten sind möglicherweise alle IDs fertig, sodass ich diese IDs erneut verwenden muss. Dies ist also das folgende Programm, das ich mit dem obigen Executor geschrieben habe.

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); 
    }
}

Meine Fragen sind: - Ist dieser Code richtig, was die Leistung angeht oder nicht? Und was kann ich sonst noch machen, um es genauer zu machen? Jede Hilfe wird geschätzt.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage