Wątki + Swing

0

Po kliknieciu przycisku, chcialbym wywołać dwa wątki, z czego drugi powinnien rozpocząć działanie dopiero po zakończeniu pierwszego.
Tak naprawde to z 4 takie wątki chciałbym wywołać jak to zrobić ?

0

Po co dwa wątki skoro zadania są sekwencyjne?

0

Wstawiłem komponent przegladarki na Panel JWebBrowser, nastepnie przechodze na strone webBrowser.navigate("url") i musze odczekac około 4 sekundy po czyn sprawdzam webBrowser.getLoadProgress!=100 jezeli tak to dalej czekam. A musze odczekac ponieważ podczas ladowania strony ta funkcja kilka razy zwraca 100. W momencie gdy strona sie wpelni zaladuje wykonuje jakas akcje. I drugi watek robi to samo przechodzi do jakies strony sprawdza czy sie zaladowala i wykonuje akcje.

0

Thread.join() służy do czekania na zakończenie wątku, ale pomyśl czy nie dałoby się zrobić jednego wątku. Klasa Thread implementuje Runnable, więc z pierwszego wątku mógłbyś wywołać run() zamiast start(), przez co nie tworzyłbyś niepotrzebnie drugiego wątku.

0
ExecutorService es = Executors.newSingleThreadScheduledExecutor();

//Kod ponizej wykonuje sie po nacisnieciu przycisku
	LongTask process = new LongTask(webBrowser, "jakis url"){
	protected void done() {
           Actions.getHtmlContent();
           Actions.saveChangge();
    }
};

es.execute(process);

//Klasa dziedziczaca po swingworker
public class LongTask extends SwingWorker{

	private JWebBrowser webBrowser;
	private boolean finish = false;
	private String url;
	
	public LongTask(final JWebBrowser webBrowser,final String url){
		this.webBrowser = webBrowser;
		this.url = url;
		webBrowser.addWebBrowserListener(new MainWebBrowserListener() {
			public void loadingProgressChanged(WebBrowserEvent wbe) {
			JWebBrowser wb = wbe.getWebBrowser();
			int progress = wb.getLoadingProgress();
				if (progress == 100) {
					finish = true;
				}
			}
		});
		if(url!=null){
			webBrowser.navigate(url);	
		}
	}

	protected Object doInBackground() throws Exception {
		if(url!=null){
			while(!finish){
				Thread.sleep(2000);
	    	}
		}
	
		return "next";
	}
    
    protected void done() {
    }
}

 

I mam kilka takich roznych zadan jak to zrobic zeby po kolei sie wykonywalo ?

0

A po co w kółko sprawdzasz czy została załadowana strona, skoro masz listener, który dostaje takie informacje?

Nie wiem czy dobrze zrozumiałem, ale masz 2 akcje do zrobienia, więc możesz stworzyć dwie klasy implementujące listenera. Najpierw dodajesz instancję jednej, po załadowaniu 100 % usuwasz tą instancję listenera, wykonujesz akcję, a potem dodajesz instancję innego listenera itd

Oczywiście zależy też jak długie są te akcje do zrobienia. Jeżeli są bardzo długie to trzeba jednak mieć ten dodatkowy wątek i jemu przekazywać zdarzenia.

0

Mam dwie akcje do wykonania
-> przejscie na strone www.costam.pl -> (sprawdzenie czy sie strona załadowała) -> wykonanie akcji
po wykonaniu poprzedniej akcji -> przejscie na inna strone -> (sprawdzenie stanu zaladowania) -> wykonanie kolejnej akcji

0

Mógłbys jakis przykład kodu podać ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1