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ć ?
Po co dwa wątki skoro zadania są sekwencyjne?
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.
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.
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 ?
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.
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
Mógłbys jakis przykład kodu podać ?