java - klasa Timer i TimerTask

0

hey, chcialbym napisac program w ktorym watek bedzie dzialal przez okreslony czas np 3 min.
troche poczytalem i chyba trzeba to zrobic uzywajac klas Timer i TimerTask oraz metody schedule(), niestety nie znalazlem zadnego ciekawego przykladu i nie potrafie uzyc tych klas i metody i wlasnie prosilbym o jakis przyklad

z gory wielkie dzieki

0
import java.util.Timer;
import java.util.TimerTask;

/**
 * Prosty przykład użycia java.util.Timer do pojedynczego uruchomienia
 *  zadania po upływie 5 sekund.
 */

public class Reminder {
    Timer timer;

    public Reminder(int seconds) {
        timer = new Timer();
        timer.schedule(new RemindTask(), seconds*1000);
	}

    class RemindTask extends TimerTask {
        public void run() {
            System.out.format("Time's up!%n");
            timer.cancel(); //Wyłączamy taska
        }
    }

    public static void main(String args[]) {
        new Reminder(5);
        System.out.format("Task scheduled.%n");
    }
}

Źódło: http://java.sun.com/docs/books/tutorial/essential/threads/timer.html - czyli tutorial wg Sun'a jak używać klas Timer i TimerTask

0

a jak zrobic zeby watek wykonywal sie przez okreslony czas... probowalem tak ale nie dziala
[code]
import java.util.Timer;
import java.util.TimerTask;
import java.util.Calendar;
import java.util.Date;

public class Reminder{
Timer timer;
Date start = new Date();
long czas = 100;

public Reminder(int seconds){
	timer = new Timer();
	timer.schedule(new RemindTask(), start, czas*seconds);
}

class RemindTask extends TimerTask{
	public void run(){
		System.out.println("Time's up!\n");
		for(int i=1; i<2000; i++)
			System.out.println(i);
			
		timer.cancel();
	}
}

public static void main(String args[]){
	System.out.println("About to schedule task.");
	new Reminder(5);
	System.out.println("Task scheduled.");
}

}
[/code]

0

Rozumiem, że chcesz aby TimerTask wykonywał się przez określony czas, z kilkukrotnym wywołaniem metody run taska. Jeśli tak to rozwiązanie jest takie

public class Reminder{
	Timer timer;
	Date start = new Date();
	long czas = 100;
        long ileTikniec = 100;
        long i;
	
	public Reminder(int seconds){
		timer = new Timer();
		i = 0;
                timer.schedule(new RemindTask(), start, czas*seconds);
	}

	class RemindTask extends TimerTask{
		public void run(){
			System.out.println("Time's up!\n");
			System.out.println(i);
			if (i == ileTikniec) {
                            System.out.println("Koniec");
			    timer.cancel();
                        }
			i++;	
		}
	}
	
	public static void main(String args[]){
		System.out.println("About to schedule task.");
		new Reminder(5);
		System.out.println("Task scheduled.");
	}
0

jeszcze nie o to mi chodzi - chyba... sie juz sam w tym gubie ;)

bo w tej chwili dziala to (chyba) tak ze wypisuje tekst z pewnym opoznieniem USTALONA ilosc razy

a ja chce zeby to dziaialo przez USTALONY czas np. mam tablice liczb calkowitych i chce przez 30 sekund wprowadzac do niej liczby z klawiatury, przypuszcalnie raz uda mi sie wprowadzic 30 liczb inna raza 45 a jeszcze inna 5 :)

0

Skoro tak to do tego nadaje się pierwszy kod. Dodatkowo musisz go wyposażyć w zmienną logiczną, która będzie infomowała o możliwośći wprowadzania danych. Szkielet programu będzie wyglądał tak:

  • ustaw flagę zezwolenia (true)
  • włącz timer - w metodzie run() wpisujesz kasowanie flagi zezwolenia i wyłączenie taska
  • dopóki (flaga_zezwolenia)
    • wczytaj liczbę

Czy o to chodziło?

0

ja po prostu chcialem zrobic cos takiego ze wpisuje te liczby do tablicy i jest tak

-Podaj liczbe :
-i ja sie zastanawiam przez 30 sec co wpisac, czas minal, ja nadal nie wpisalem, ale ze ten czas juz minal to Timer sam konczy mozliwosc podawania liczb, wypisujac np. czas sie skonczyl - i nie czekajac az wcisne enter

import java.util.Timer;
import java.util.TimerTask;
import java.util.Calendar;
import java.util.Date;
import java.io.*;

public class Reminder2{
        Timer timer;
        Date start = new Date();
        long czas = 1000;
        long ileTikniec = 10;
        long i;
		
		BufferedReader zKlawiatury = new BufferedReader( new InputStreamReader(System.in) );
		int [] tab = new int[1000];
		int index = 0;
		boolean spr = true;
		
        public Reminder2(int seconds){
                timer = new Timer();
                i = 0;
                timer.schedule(new RemindTask(), start, czas*seconds);
        }

        class RemindTask extends TimerTask{
                public void run(){
                    while(spr==true){
                       	try{
                       	   	System.out.println("Podaj wartosc : ");
                       		String strLiczba = zKlawiatury.readLine();                       
                       		int intLiczba = Integer.parseInt(strLiczba);
                       		tab[index] = intLiczba;
                       		index++;

                        	if(/*jesli czas sie skoczyl*/){ //!!!!!!!!!!!
                        		spr = false;
                        		timer.cancel();                        		
                        	}
                        }catch(IOException e){
                        	System.err.println("blad");
                        }  
                    }//while 
                }//run
        }
       
        public static void main(String args[]){
                System.out.println("About to schedule task.");
                new Reminder2(30);
                System.out.println("Task scheduled.");
        }

}

o cos takiego Ci chodzilo ??

0

Nie, w tasku w metodze run robisz tylko wyłączenie flagi i może jeszcze zamknięcie strumienia czytającego z klawiatury i przypisanie mu nulla. W metodzie głównej wpisz pętlę czytającą

while ((strLiczba = zKlawiatury.readLine()!=null) && flaga) {
//wykonaj operację na strLiczba
}

W metodzie run blokujesz tylko odczyt.

0

wywala mi blad : operator & cannot be aplied to java.lang.String,boolean

0

Sory pomyliłem nawiasy

while (((strLiczba = zKlawiatury.readLine())!=null) && flaga) {
//wykonaj operację na strLiczba
}
0

mam jeszcze jedno pytanie, jak sprawic zeby program glowny (main) wiedzial ze timer skonczyl dzialanie

import java.util.Timer;
import java.util.TimerTask;

public class TimerTaskDemo{
	Timer timer;
	int licznik = 0;
	int minuta = 0;
	
	//konstruktor
	public TimerTaskDemo(){
		timer = new Timer();
		timer.schedule( new Task(), 0 , 1000 );
	}
	
	class Task extends TimerTask{
		public void run(){
			System.out.println(licznik);
			licznik++;

			if( (licznik % 60) == 0 ){
				minuta++;
				System.out.println(minuta + "minuta...\n");
				
				if(minuta == 1){
					timer.cancel();
					System.out.println("koniec");
				}		
			}
		}
	}
	
	public static void main(String [] args){
    	         new TimerTaskDemo();
	}
		
}

chodzi mi o cos takiego

public static void main(String [] args){
         new TimerTaskDemo();
         if(timer zakonczyl odliczanie){
               System.out.println("KONIEC odliczania timer'a")
         }
}

</cpp>
0

TimerTaska daj jako klasę zewnętrzną. Dodaj publiczną zmienną boolean którą włączysz przed wywołaniem schedule a potem wyłączysz przed cancel. W pętli sprawdzającej koniec musisz odwołać się do zadeklarowanej zmiennej.

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