title image


Smiley Hilfe zur Fehlersuche
Hallo, ich bräuchte schon wieder eure Hilfe!



Ich schreibe an einem Applet (genauer: JApplet) und habe mir für die nicht-gui Aufgaben eine Klasse geschreiben, die eine invokeLater(Runnable) Methode besitzt. Diese sollte genau wie SwingUtilities.invokeLater funktionieren, nur dass eben nicht Swing sondern ein anderer Thread diese Aufgaben übernimmt.



in der destroy-Methode des JApplets habe ich folgenden Code stehen:

public void destroy() {

super.destroy();

final GalleryCreator galleryCreator = getGalleryCreatorVariable();

if (galleryCreator != null) {

Worker.invokeLater(new Runnable() {

public void run() {

galleryCreator.disconnect();

System.out.println("getrennt");//Debugging

}

});

}

Worker.terminate();

}





Egal, was ich jetzt mache, disconnect() wird nie aufgerufen!

1. Vermutung: Worker terminiert, bevor alles ausgeführt wurde - leider wird disconnect() auch nicht ausgeführt, wenn ich terminate() auskommentiere.

Da ihr vermutlich eure Glaskugel wieder mal in der Reinigung habt, hier noch der Code der Worker-Klasse.

Welcher Thread bearbeitet eigentlich die destroy()-Methode?



import java.util.concurrent.ArrayBlockingQueue;



/**

* Worker class for background processes when using swing.

*

* @author Franz Fischer

*/

public final class Worker implements Runnable {



/**

* Constructor.

*/

private Worker() {

// dummy

}



/**

* A job which can processed by the worker class.

*

* @param

* type of the parameter.

*/

public abstract static class Job implements Runnable {



/**

* Constructor which accepts a parameter.

*

* @param parameter

* a parameter which can be asked inside the run method by

* using the method getParameter()

*/

public Job(final T parameter) {

par = parameter;

}



/**

* Default Constructor.

*/

public Job() {

par = null;

}



/**

* Getter method.

*

* @return the parameter which was passed in the constructor. If the

* object was created using the default constructor this method

* returns null.

*/

public final T getParameter() {

return par;

}



/**

* The parameter passed in the constructor.

*/

private final T par;

}



/**

* @see java.lang.Runnable#run()

*/

public void run() {

do {

try {

OPERATIONS.take().run();

} catch (final InterruptedException e) {

terminate = true;

}

} while (!terminate || !OPERATIONS.isEmpty());

}



/**

* Appends a runnable object to the worker's queue.

*

* @param runnable

* object to be added

*/

public static void invokeLater(final Runnable runnable) {

{

OPERATIONS.add(runnable);

if (THREAD == null) {

THREAD = new Thread(WORKER, "Worker");

THREAD.setPriority(Thread.NORM_PRIORITY - 1);

THREAD.start();

}

}

}



/**

* Causes the worker process to terminate as soon as the job queue gets

* empty.

*/

public static void terminate() {

{

if (THREAD != null) {

THREAD.interrupt();

}

}

}



/**

* Size of Blocking Queue.

*/

private static final int QUEUE_SIZE = 64;



/**

* Queue for runnable's.

*/

private static final ArrayBlockingQueue OPERATIONS = new ArrayBlockingQueue(

QUEUE_SIZE);



/**

* Thread instance.

*/

private static Thread THREAD = null;



/**

* Worker instance.

*/

private static final Worker WORKER = new Worker();



/**

* Termination flag.

*/

private static boolean terminate = false;

}







Nachtrag: Problem ist nach Umstellung auf die SwingWorker-Klasse gelöst, allerdings würde mich trotzdem immer noch interessieren, was vorher schief gelaufen ist.

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: