Wie ein Runnable etwas zurückgeben kann
Veröffentlicht: 22.05.2010 um 12:30 von Landei
Folgende Situation: Ich wollte in einer Methode ein Fenster erzeugen und zurückgeben. Sicher, nichts einfacher als das... wenn man Sun's Empfehlung ignoriert, das ganze im EDT zu starten. Sicher, in der Praxis gibt es normalerweise keine Schwierigkeiten, wenn man zumindest den JFrame-Konstruktor im aktuellen Thread ausführt, und nur das "Befüllen" im Runnable erledigt. Aber hier bin ich ein Prinzipienreiter: Ich will ein Runnable, das etwas zurückgibt...
Lustigerweise kommt in meiner Lösung das Wort Runnable gar nicht vor, dafür das weniger bekannte Interface Callable und die Klasse FutureTask - die im Prinzip aus einem Callable ein Runnable macht:
Statt mit task.get() einfach schnöde zu blockieren, kann man auch einen Time-Out angeben oder mit task.isDone() fragen, ob der Task schon fertig ist.
Soviel zu einer relativ einfachen Technik, um ohne faule Tricks einen Wert zurückzubekommen, auch wenn die API nur ein Runnable haben will.
Lustigerweise kommt in meiner Lösung das Wort Runnable gar nicht vor, dafür das weniger bekannte Interface Callable und die Klasse FutureTask - die im Prinzip aus einem Callable ein Runnable macht:
1 2 3 4 5 6 7 8 9 10 11 12 public JFrame getFrame() { FutureTask<JFrame> task = new FutureTask<JFrame>(new Callable<JFrame>(){ public JFrame call() { JFrame frame = new JFrame("Hey"); //Initialisierung von frame frame.setVisible(true); return frame; } }); SwingUtilities.invokeLater(task); return task.get(); }
Statt mit task.get() einfach schnöde zu blockieren, kann man auch einen Time-Out angeben oder mit task.isDone() fragen, ob der Task schon fertig ist.
Soviel zu einer relativ einfachen Technik, um ohne faule Tricks einen Wert zurückzubekommen, auch wenn die API nur ein Runnable haben will.
Kommentare 0




