ThreadPoolExecutor | Die Aufgaben sollen reihe nach bearbeitet werden

Dit_

Bekanntes Mitglied
Hallo in meinem FTP Modul soll verhindert werden, dass die Aktionen die vom Benutzer ausgelöst wurden, nicht parallel bearbeitet werden. zb es werden gerade Dateien hochgeladen und man entfernt eine Datei.
Dafür habe ich diese Klasse geschrieben.

Was mir nicht gefällt ist das hier :
Code:
new ThreadPoolExecutor(1, 1, 2, TimeUnit.MINUTES, workQueue);

Gibt es vielleicht in java vordefinierte ThreadPools dafür?

Danke schon mal.

😳

Java:
public class BlockingQueueThreadExecuter {
    
    private final BlockingQueue<Runnable>      workQueue = new ArrayBlockingQueue<Runnable>(20);
    private final ThreadPoolExecutor           pool      = new ThreadPoolExecutor(1, 1, 2,
                                                                 TimeUnit.MINUTES, workQueue);
    
    private static BlockingQueueThreadExecuter _instance;
    
    /**
     * Neue Aufgabe
     * 
     * @param job
     */
    public static final void newJob(Runnable job) {
        if (_instance == null) {
            _instance = new BlockingQueueThreadExecuter();
        }
        _instance.pool.execute(job);
    }
    
    /**
     * @param <V>
     * @param task
     * @return
     */
    public static final <V> Future<V> newJob(Callable<V> task) {
        if (_instance == null) {
            _instance = new BlockingQueueThreadExecuter();
        }
        return _instance.pool.submit(task);
    }
    
}
 
Du willst doch eigentlich gar keinen ThreadPool, du willst einen einzigen Thread der die Queue abarbeitet.
 
Gibt es in deinem Beispiel nicht eine Race Condition wenn parallel ausführende Threads newJob() aufrufen ? Das static field muss über synchronized geschützt werden. Eine Executor-Implementierung sollte eigentlich von beliebig vielen Threads parallel benutzt werden können. Deshalb auch im java.util.concurrent Packet...

Ich kenne jetzt deinen Anwendungsfall nicht, aber ich dachte mir, falls du diese Klasse konkurrierend benutzt werf ich das mal in den Ring^^

Zum eigentlcihen Problem stimme ich Empire Pheonix zu, eine Queue mit Runnables ist das, was du suchst. Falls du es unbedingt mit einem ExecutorService (Threadpool) machen willst, dann schau dir mal Executors.newSingleThreadExecutor();

Gruß,

Chris
 
zb es werden gerade Dateien hochgeladen und man entfernt eine Datei.
Dafür habe ich diese Klasse geschrieben.
Das sollte doch eigentlich vom Betriebssystem schon gemanaget werden. Wenn du eine Datei löschen willst, die von einem anderen Thread geöffnet ist, sollte eine IOException geworfen werden.
 

Neue Themen


Zurück
Oben