Multithreading in SWT

Maxim6394

Bekanntes Mitglied
Ich versuche grade in einem SWT Client mehrere Verbindungen aufbauen zu lassen und von jeder Verbindung müssen über eine while Schleife Daten gelesen werden, was mit nur einem Thread natürlich das ganze UI einfriert. Hab jetzt rausgefunden dass man mit shell.getDisplay().getDefault().asyncExec(r); einen Thread starten kann der z.B. den Text von UI Elementen verändert, was ja von einem fremden Thread aus nicht geht. Zum testen hab ich jetzt 2 Runnables die nacheinander mit asyncExec gestartet werden sollen, jede schreibt 1000 mal jeweils r1 und r2 in die Ausgabetextbox. Was ich nicht verstehe ist, dass die runnables nacheinander ausgeführt zu werden scheinen. Es wird zuerst 1000 mal r1 ausgegeben und dann 1000 mal r2, obwohl es vermischt sein müsste.
Woran liegt das?

Java:
Runnable r = new Runnable()
	{
		@Override
		public void run() {
			Random r=new Random();
			int i=r.nextInt();
			for(int h=0;h<1000;h++)
				cout("r1|"+i+"|"+h+br);
		}
	};
Runnable r2 = new Runnable()
	{
		@Override
		public void run() {
			Random r=new Random();
			int i=r.nextInt();
			for(int h=0;h<1000;h++)
				cout("r2|"+i+"|"+h+br);
		}
	};

//der clicklistener vom button führt diese methode aus
public void onConnectClicked()
{
shell.getDisplay().getDefault().asyncExec(r);
shell.getDisplay().getDefault().asyncExec(r2);
}

public void cout(final String str)
	{
		shell.getDisplay().asyncExec(new Runnable()
		{
			@Override
			public void run() {
				stConsole.setText(str+stConsole.getText());
			}	
		});
		
	}
 

dzim

Top Contributor
Du rufst deine Threads "async" auf, aber immer noch auch dem UI-Thread... Das bringt nichts! Dadurch weisst du nur nicht genau, wann diese Runnables gestartet werden. Du sagst deinem Programm im Gegenteil sogar, es soll die Runnables explizit auf dem UI-Thread ausführen.
Also: Ersetze "shell.getDisplay().getDefault().asyncExec(r);" einfach durch "new Thread(r).start();" (u.s.w.) und fertig. Deine "cout"-Methode sollte so direkt bereits funktionieren.

BTW: Keine Sorge... Den gleichen Quark hab ich auch schon hinter mir :-D
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben