Final Methode dennoch überschreiben!

Status
Nicht offen für weitere Antworten.
T

tuxedo

Gast
Hi,

gibts irgend einen Trick per Reflection oder so mit dem ich eine final Methode, obwohl man es nicht können sollte, doch überschreiben kann?

Hintergrund:

Wir haben eine SWT Anwendung die jede Menge Runnables in den UI-Thread steckt um Dinge zu Zeichnen oder zu aktualisieren. Das führt, je nachdem wie der Benutzer die Anwendung konfiguriert, zu einem Overload so dass die Anwendung nicht mehr richtig reagiert, weil der UI Thread einfach zu viel zu tun hat.

Ich hab jetzt die Aufgabe einen Health-Monitor zu bauen der Auskunft darüber gibt "wie gut" es der Anwendung denn gerade geht.
Hab ein wenig geforscht und herausgefunden, dass in org.eclipse.swt.widgets.Synchronizer, eine Liste mit den Runnables (bzw. RunnableLocks) geführt wird. Ich kann Synchronizer zwar überschreiben und dem Display diesen eigenen Synchronizer als standard Synchronizer übergeben, doch hab ich nur 2 final Methoden die ich überschreiben/erweitern kann:

- syncExec()
- asyncExec()

Damit könnte ich selbst einen Zähler inkrementieren den ich von aussen abfragen kann. Aber zum dekrementieren des zählers müsste ich in die Methoden, die direkt von der Displayklasse genutzt werden eingreifen.

Wenn das mit dem "doch überschrieben" nicht geht: Hat jemand ne andere Idee für mich wie ich das generisch lösen kann ohne die bereits bestehenden Runnables so zu modifizieren dass sie mit dem letzten Statement in run() den Zähler dekrementieren?!

Gruß
Alex

P.S. Methodennamen die mit einem blauen dreieck im Eclipse Outline-View gekennzeichnet sind, sind dich final, oder?
 
S

SlaterB

Gast
kannst du nicht run() überschreiben
und

..
super.run()
..

ausführen?
 
T

tuxedo

Gast
Sorry, war etwas spät mit meinem Edit. Methoden sind offensichtlich final, nicht private.

Um run() zu Überschreiben, müsste ich doch alle Runnables nochmal in die Hand nehmen und anpassen. Und die Lösung wäre dann nur für angepasste, spezielle Runnables tauglich.

An das field "messages" und "messageCount" (das wäre schon der optimale Zähler) komm ich leider auch nicht ran ...
 

Wildcard

Top Contributor
Eclipse Anwendung, oder reine SWT Anwendung? Wenn es eine Eclipse Anwendung ist, verwende Jobs.
 
T

tuxedo

Gast
Eclipse-Anwendung.
Was ist an Jobs besser? Hast du da vllt. nen Link parat (ausser nen APIDoc Link)?

BTW: Die Tasks hier MÜSSEN im UI Thread (sämtliche Aufgaben stehgen da in Verbindung mit SWT (UI updated, SWT-Ole-Kommunication, ...)) laufen. Laufen die Jobs da auch drin oder laufen die in nem eigenen Thread?!

Hab die Sache mit dem MessageCount lösen können:

Code:
 Method m = display.getClass().getDeclaredMethod("getMessageCount",null);
		    m.setAccessible(true);
		    int result = (Integer) m.invoke(display, null);
		    System.out.println("messageCount="+result);

Das Display selbst hat intern eine Methode um die Anzahl der zu verarbeitenden Messages abzufragen. Aber eben nur intern. Aber mit dem Workaround kommt man auch so dran.

Nebenbei:
Ist die eine Technik bekannt mit dem man einen im UI Thread blockierenden Task (jetzt mal losgelöst von den Runnables, also mehr allgemein) abschießen kann so dass die Anwendung wieder läuft?

Gruß
Alex
 

Wildcard

Top Contributor
Jobs sind mit das beste was Eclipse zu bieten hat...
http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html
Jobs laufen in Workerthreads, aber du kannst auch dort Arbeit in den UI Thread verschieben. Der große Vorteil den dir ein Job für dein Vorhaben bieten kann, ist das du größeren Einfluss auf das Scheduling hast. Du kannst beispielsweise die maximale Anzahl von Jobs aus der gleichen Familie beschränken und soweit ich das Problem verstanden habe, ist das genau was du suchst.
 
T

tuxedo

Gast
Die einzige Arbeit die zu verrichten ist, ist bei mir UI arbeit. Das ist ja die Sache. Ich hab nahezu keine Zeile Code in meinen Runnables die nicht die UI betreffen. Sprich, ich hab keine Programmlogik im UI Thread laufen, sondern SWT-Stuff (Message Ticker zeichnen und updaten, mit SWT geladenen OleControlSites mit Methodenaufrufen befeuern und und und. Eben alles was definitiv den UI Thread brauch weil ich sonst Exceptions bekomme weil ich nicht im UI Thread bin.

Von daher bin ich mir nicht sicher ob da Jobs hilfreich sind.

Gruß
Alex

P.S. Ist keine normale "Büroanwendung". Hier gehts um dutzendweise Videos und allerlei grafische Spielereien mit den Videos, gefolgt von der Tatsache, dass die meisten Videos über die SWT-Ole Brücke (also ActiveX Controls) angebunden sind, und diese Kommunikation eben auch wieder den UI Thread beansprucht (bzw. beanspruchen muss).
 

Ariol

Top Contributor
EDIT: So ist's besser (Reihenfolge der Threads):

Eine sich selbst abarbeitende Queue:
Code:
import sun.misc.Queue;

public class RunnableQueue extends Queue {

	int maxRunnables = 2;
	
	Thread queueManager = new Thread() {		
		public void run() {
			while (true) {
				try {
					if (!isEmpty() && Counter.getValue() < maxRunnables) {
						try {
							Thread t = new Thread((Runnable) dequeue()) {
								@Override
								public void run() {

									Counter.increase();
									super.run();
									Counter.decrease();
								}
							};
							t.start();

						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	};
	
	public RunnableQueue(int maxRunnables) throws Exception {
		if(maxRunnables <= 0)
		{
			throw new Exception("maxRunnables must be >= 1");
		}
		
		this.maxRunnables = maxRunnables;		
		queueManager.start();
	}

}

Ein statischer Zaehler:
Code:
public class Counter {

	private static Integer count = 0;
	
	public static synchronized void decrease()
	{
		synchronized (count) {
			count--;
		}
	}
	
	public static synchronized void increase()
	{
		synchronized (count) {
			count++;
		}
	}
	
	public static synchronized int getValue()
	{
		return count;
	}
}


Und zum Testen:

Code:
public class CounterTest {
	public static void main(String[] args) {
		startSynchronized();

	}

	public static void startSynchronized() {

		try {
			RunnableQueue rQueue = new RunnableQueue(10);

			for (int i = 0; i < 100; i++) {

				final int j = i;

				rQueue.enqueue(new Thread() {

					public void run() {
						System.out.println(j + " - " + Counter.getValue());
						try {
							sleep(1000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}

				});
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

Thread hab ich in der Testklasse nur benutzt um mit sleep arbeiten zu koennen.
 
T

tuxedo

Gast
Dumme Frage @Ariol, aber hast du meinen ersten Post zuende gelesen oder nur die ersten Paar brocken?!

AFAIK ist mit SWT eine solche Queue icht möglich, der queued selbst.

Sorry, aber dein Post ist leider am Ziel vorbei gegangen.

- Alex
 
T

tuxedo

Gast
Fragen beantwortet man doch nicht mit gegenfragen?!

Nochmal:

In SWT gibt es die Klasse Display. Die brauch ich um überhaupt was auf den Schirm zu kriegen. Display verwendet intern eine Klasse "Synchronizer", welcher eine "List" mit RunnableLocks führt.

Ich kann zwar Display meine eigene "Synchronizer" Implementierung mitteilen (also so in etwa wie du's dort oben aufgeführt hast), nur muss diese Implementierung von "Synchronizer" erben. Und dort gibt es nur 2 Methoden die sich überschreiben lassen.

Und das sind die Methoden um neue Tasks in die Liste einzufügen. Alle anderen Methoden, die Display z.B. verwendet um einen Eintrag aus der Liste zu holen, sind final. Sprich ich kann sie nicht überschreiben. Folglich kann ich zwar einen Zähler inkrementieren wenn ein neuer Task reinkommt, aber beim entfernen des Tasks durch "Display" kann ich den Zähler nicht dekrementieren weil ich an die Methoden nicht rankomme.

Schau dir doch mal den Source zu "Display" und "Synchronizer" an. Dann siehst du was ich meine.

Aber wie schon gesagt: Ich hab eine Lösung gefunden, und die besteht darin "Display" direkt nach dem Zählerstand zu fragen. Das geht auch über eine "private final" Methode. Aber die muss ich nciht überschrieben, ich muss lediglich konfigurieren dass die Methode doch "accessible" ist und schon kann ich sie aufrufen (siehe oben). Sprich: Ich brauch ncith rund 100 Zeilen Code für eine eigene Queue implementierung die so gar nicht zum Ziel führt, sondern nur 2-3 Zeilen um die "gesperrte" Methode doch aufrufen zu können.

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
G final "spammen" + bedeutung Allgemeine Java-Themen 14
J Final Method Allgemeine Java-Themen 9
I Java: public final Werte: Gute oder schlechte Praxis? Allgemeine Java-Themen 6
Neumi5694 Interpreter-Fehler final Eigenschaft während Laufzeit geändert Allgemeine Java-Themen 2
J private static final String variable Allgemeine Java-Themen 8
T Enumeration/Static Final/Bitfield Allgemeine Java-Themen 6
M final vor dem parameter eines Konstruktors Allgemeine Java-Themen 1
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
X Cannot refer to a non-final variable settings inside an inner class defined in a different method Allgemeine Java-Themen 4
G Synchronization on non final field Allgemeine Java-Themen 10
Z Als Final deklarierte Klasse im Array sortieren Allgemeine Java-Themen 2
G Klasse als final -> Laufzeitverbesserung? Allgemeine Java-Themen 4
W Innere Klasse und final Allgemeine Java-Themen 11
A Als FINAL deklarieren -> sinnvoll? Allgemeine Java-Themen 16
S 2 Fragen allgemeine fragen zu final und interface Allgemeine Java-Themen 13
S Reflections und final Allgemeine Java-Themen 19
O does not declare a static final serialVersionUID field of . Allgemeine Java-Themen 6
meez immutable final? Allgemeine Java-Themen 23
S Wave Soundausgabe Java 1.4.2 contra 1.5 Final Allgemeine Java-Themen 27
G final und Variablen Allgemeine Java-Themen 16
B Java 5.0 Final Allgemeine Java-Themen 3
M 1.5 final? Allgemeine Java-Themen 2
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
snipesss Methode greift nicht auf JTextPanel zu Allgemeine Java-Themen 3
R Methode in Methode voraussetzen Allgemeine Java-Themen 8
S Überschriebene Methode der Oberklasse der Oberklasse aufrufen. Allgemeine Java-Themen 5
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben