[java]Czasowe wykonanie programu POMOCY

0

Witam
mam probe ponieważ nie mogę sobie do końca poradzić z takim zadaniem

mam plik ( dziala w tle np serwer )

który o określonej dacie i godz uruchomi wątek (np polaczy sie z serwerem poczty i wysle plik ). chodzi mi głownie o to wykonanie sie w odpowiednim czasie zamieszcze kod który niestety ale nie dziala nawet po długim czasie edycji proszę o jakieś sugestie

public class kalendarz
{ Timer czas;

public kalendarz(int year, int month,int date,int hour,int minute)
{ Calendar Kal = Calendar.getInstance();

Kal.set(Calendar.YEAR,2009); //
Kal.set(Calendar.MONTH,06);
Kal.set(Calendar.DATE,26);
Kal.set(Calendar.HOUR,06); //
Kal.set(Calendar.MINUTE,33);
Date time = Kal.getTime();
System.out.println("czas wykonania programu "+time);
czas.schedule(new Czass(),time);
}

class Czass extends TimerTask { // co najpier wykona
public void run() {
System.out.format("wykonanie zadania najpierw bez daty");
// tu bedzie wątek do uruchomienia
czas.cancel(); //Terminate the timer thread
}
}

public static void main(String args[]) {
new Czas(2009,06,26,06,20);
System.out.format("Wykonuje zadanie o okreslonej dacie ");
}
}

0

Ja takie problemy rozwiązuję okresowo sprawdzając czas w pętli:

boolean wykonano = false;
while(!wykonano){
  if(tu sprawdzenie czasu){
    wykonano = true;
    //tu wykonanie polecenia
  }
}

w warunku pętli sprawdzasz czas. Pamiętaj, ze można zawsze uzyskać aktualny czas w formie liczby sekund od określonej daty (chyba 1 stycznia 1960, czy jakoś tak), tylko nie pamiętam jaka funkcja zwracała tą wartoś ć w javie. Wystarczy wtedy żebyś w warunku porównał 2 longi i tyle.

0

Ok sprawdziłem, napisz tak:

Date d = new Date(year, month, date, hrs, min, sec); //wybierz najlepszy dla ciebie konstruktor
//Date d = new Date(year, month, date, hrs, min);
//Date d = new Date(year, month, date);
boolean wykonano = false;
while(!wykonano){
  if(d.after(new Date())) //jeśli już czas
  {
    wykonano = true;
    //tu twój kod
  }
}
0

Katastrofa - ten while bedzie wpierdzielac prawie 100% procka, to tzw busy-waiting.
O wiele lepiej cos takiego:

Date d = new Date(year, month, date, hrs, min, sec); //wybierz najlepszy dla ciebie konstruktor
//Date d = new Date(year, month, date, hrs, min);
//Date d = new Date(year, month, date);
boolean wykonano = false;
while(!wykonano){
   Date now = new Date();
  if(d.after(now)) //jeśli już czas
  {
    wykonano = true;
    //tu twój kod
  } else {
        long millis = d.getTime() - now.getTime();
       try {
             Thread.sleep(millis);
        } catch (InterruptedException exc) {
                // ignore
         }
   }
}
0

Wielkie dzięki..... [browar] dla was :)

0

Ops, sry, zapomniałem wpisać, Sleep(1000), dobrze, że mnie poprawiłeś, jakoś zawsze pisałem, a teraz zapomniałem :).
Taki urok pisania po nocy kodu z pamięci ;P

0

Rzuć okiem jeszcze tutaj:
Harmonogramy zadań

0

@koziolek, wszystko fajnie, ale nie sadzisz ze zaprzeganie Quartza do jakiegos tam zadanka ktore koles napisal w jednej klasie to lekka przesada?
Co do zaproponowanego rozwiazania i jego przydatnosci w realnym swiecie - myslisz ze jak robi to Quartz? Albo cron? tez robia sleepy i budza sie po jakims czasie aby sprawdzic czy juz czas. One tylko znacznie rozszerzaja ten sposob.
Pozdrawiam.

0

Tak, tylko pomiędzy quartzem, a proponowanym rozwiązaniem jest ta mała różnica, że nie trzeba bawić się w zarządzanie czasem, synchronizację, kontrolę dostępu.

0

Wszystko sie zgadza, chodzilo mi o to ze to chyba przyslowiowe wyciaganie armaty na muche. Ale tez mozna.
Pozdrawiam.

0

A czemu po prostu nie uzyc jednej z dwoch klas Timer dostepnej w JDK (java.util. lub javax.swing? W przeciwienstwie do malo czytelnych petli i zmiennych sterujacych, mozna posluzyc sie prostym i czytelnym API.
Pozdr.

0

Mozna, owszem, tyle ze autor watku napisal ze ma takie zadanie wiec prawdopodobnie wszyscy doszli do wniosku ze wlasnie ma zrobi to na petli. Sam pewnie wiesz jakie zadania daja w szkolach, i ze czasami robisz to co juz gdziestam jest.

0

a takie pytanie jak w Javie można sprawdzić ze np dana wiadomość z serwera pop została przeczytana ? Jest jakaś class czy trzeba kombinować ?

0

Zajrzyj tu http://java.sun.com/products/javamail/javadocs/index.html, klasa POP3Folder i odsyłacz com.sun.mail.pop3

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