2012-04-16 6 views
5

In Java gibt es eine Möglichkeit, die Priorität für den Thread, der die doInBackground() Methode eines SwingWorker Objekts aufrufen wird, zu setzen?Gibt es eine Möglichkeit, die Priorität des von einem SwingWorker verwendeten Hintergrund-Threads festzulegen?

In der Thread-API gibt es eine setPriority() Methode. Die Methode SwingWorker.execute() plant den Swingworker für die Ausführung in einem Worker-Thread. Ich möchte Zugriff auf diesen Arbeitsthread haben, um seine Priorität festzulegen.

Aus meiner Sicht stammt dieser Worker-Thread aus einem Standard-Worker-Thread-Pool. Würde der einzige Weg, dies zu bewältigen, darin bestehen, meinen eigenen Executor zu verwenden?

+4

einreichen können, wenn Sie zu 100% aller Ihrer CPUs schließen verwenden, kann die Priorität Einstellung keinen Unterschied machen. Wenn Sie die gesamte CPU verwenden, ist die Priorität nur ein Hinweis, den die JVM oder das Betriebssystem ignorieren kann. IMHO Es wird dein Problem nicht lösen. –

+0

Die Anwendung richtet sich speziell an Windows und die JVM ist die Standard Oracle JVM. Von dieser anderen Stapelüberlauffrage macht es einen Unterschied in diesem Szenario: http://stackoverflow.com/questions/297804/thread-api-priority-translation-to-os-thread-priority – Clinton

+0

Es macht einen Unterschied für die Hinweis für das Betriebssystem. Ob es überhaupt einen Unterschied macht, wenn Sie nicht die ganze CPU benutzen, ist die Frage, die ich habe. AFAIK, wenn Sie eine Ersatz-CPU haben, läuft jeder Thread, der ausgeführt werden kann, unabhängig von der Priorität. Es spielt nur eine Rolle, wenn das Betriebssystem eine Entscheidung treffen muss, dass die Priorität zählt. –

Antwort

7

Die JDK7 SwingWorker javadoc Hinweise, dass die Designer nicht beabsichtige, für Benutzer mit direkt zu interagieren oder die Hintergrund-Threads ändern:

... the exact strategy of choosing a thread for any particular SwingWorker is unspecified and should not be relied on.

Die Umsetzung SwingWorker.getWorkersExecutorService() scheint diese Idee, wie sie zu verstärken Ich habe es so implementiert, dass es nicht einfach geändert werden kann.

SwingWorker ist eine Standardlösung für den typischen Fall und Sie haben keinen typischen Fall. Ich schlage vor, dass Sie den Code schreiben, um die Hintergrundaufgaben auszuführen, anstatt zu versuchen, SwingWorker zu hacken, um das zu tun, was Sie wollen. Auf diese Weise wird sich niemand fragen, warum SwingWorker sich nicht wie erwartet verhält.

5

Die einzige Möglichkeit, dies zu tun, ist, dass die Execute-Methode den aktuellen Thread mit Thread.currentThread() greifen. Sie können dann die Priorität dieses Threads festlegen (sofern der Aufrufer erlaubt ist).

+2

Ich denke, diese Methode könnte funktionieren. 'Thread.currentThread()' sollte in der Methode "doInBackground()" (Worker-Thread) ausgeführt werden. –

+1

Dies schien zu funktionieren. Ich denke, ich muss es möglicherweise am Ende der Methode auf die Standardpriorität zurücksetzen, da der Thread in einen Pool zurückgegeben wird und für etwas anderes verwendet wird. Wie Jason Braucht sagte, das könnte ein schlechtes Design sein. – Clinton

2

Als Swingworker ist ein Runnable, können Sie es auf jede java.util.concurrent.ExecutorService

+2

Es ist auch eine Zukunft. –

Verwandte Themen