Dostęp do pola a get i set

Dostęp do pola a get i set
PO
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 7 lat
  • Postów:92
0

Mam pewien problem. Poniżej kod:

Kopiuj
import org.apache.commons.lang3.time.StopWatch;

class MyThread implements Runnable  
{
	private int id;
	private double time;
	private  StopWatch s1 = new StopWatch();
	MyThread (int tid) 
	{
		this.id = tid;
		time = s1.getTime();
		
	}

	@Override
	public void run() 
	{
		
		s1.start();
		
			System.out.println(time); // System.out.println(getTime()); działa
		
		s1.stop();
		
	}

	public double getTime() 
	{
		time = s1.getNanoTime();
		return time;
	}

	public void setTime(double t) 
	{
		this.time = t;
	}



public class Main 
{

	public static void main(String[] args) throws InterruptedException 
	{
		  Thread threads[] = new Thread[10];
		  for (int i = 0 ; i < 10 ; i++)
		  {
			  threads[i] = new Thread(new MyThread(i));
			  threads[i].start();
					  
		  }
	}
}



	
	
}

Problem leży w tym , że przy powyższym kodzie metoda run zwraca czas na konsole jako "0". Kiedy na ekran wypiszę getTime() zamiast time to wyniki są prawidłowe, ale chodzi mi o to by wynik przekazać za pomocą tego pola a nie metody GetTime...

spartanPAGE
nie powinieneś nic ustawiać w getterze
EL
  • Rejestracja:około 13 lat
  • Ostatnio:4 miesiące
0
polgol napisał(a):
Kopiuj
	public double getTime() 
	{
		time = s1.getNanoTime();
		return time;
	}

Po co Ci w tej metodzie jesszcze time = s1.getNanoTime(); ?
Przypuszczam że to Ci zeruje czas.
Postaw się breakpointem i sprawdź co zwraca s1 i s1.getNanoTime();

edytowany 1x, ostatnio: eL
PO
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 7 lat
  • Postów:92
0

Po usunięciu time = s1.getNanoTime(); nic się nie zmieniło. Wypisując wartość pola time otrzymuję 0.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:4 minuty
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4709
3

Działa tak jak trzeba - czyli podaje 0.
Bo w konstruktorze ustawiasz (efektywnie) time = s1.getNanoTime() , który daje 0, ponieważ StopWatch jeszcze nie jest wystartowany.

Start dzieje się to dopiero w metodzie run() {.. s1.start(); }

Ale **time **jest już naonczas ustawiony na 0 i nikt go nie przestawia (chyba, że jednak wywołasz getTime())

Więc normalnie jest tam (zmienna time) 0 - i tak pozostaje.

A niby dlaczego miałoby być coś innego?


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
0

To w jaki sposób można za pomocą pola time przekazać czas , który jest zwrócony getTime()?

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Niech klasa StopWatch (raczej jakaś klasa pochodna) aktualizuje pole time.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
0

Mógłbyś podać przykład?

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:4 minuty
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4709
1

Zanim zaczniesz robić coś dalej musisz odpowiedzieć na jedno ... ważne pytanie:. Dlaczego chcesz to robić przez pole? (A co złego jest w metodzie - czy to jest jakaś różnica z punktu widzenia tego co chcesz osiągnąć?)


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
0

Chciałbym dokonać sumy zmierzonych czasów. A wykorzystując getTime i tak otrzymuję 0 , problemu upatrywałem właśnie tutaj...

Kopiuj

public class Main 
{

	public static void main(String[] args) throws InterruptedException 
	{
		  double suma = 0; 
		  Thread threads[] = new Thread[10];
		  for (int i = 0 ; i < 10 ; i++)
		  {
			  threads[i] = new Thread(new MyThread(i));
			  threads[i].start();
			  suma += new MyThread(i).getTime();
			  
			  
					  
		  }
		  
		  System.out.println("Suma : " + suma);
	}
	
	
}



Po zsumowaniu otrzymuję i tak zero. W jaki sposób mogę zsumować te czasy? Zakładamy więc że czas zwracany za pomocą getTime()

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:4 minuty
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4709
0

zamiast

private double time; napisz volatile long time;
zamiast
System.out.println(time); // System.out.println(getTime()); działa napisz time = s1.getNanoTime()

i na koniec
zamiast suma += new MyThread(i).getTime(); napisz suma += new MyThread(i).time;

To chyba wszystko. W ten sposób dostaniesz pewną liczbę - która jest zasadniczo zupełnie bezużyteczna.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
0

Czasy się pokazują, jest więc ok :) Natomiast w dalszym ciągu próbując wypisać sumę , min. w sposób jaki mi podałeś , cały czas wynik to 0.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:4 minuty
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4709
0

no tak - bo jednak
zamiast suma += new MyThread(i).getTime(); ma być suma += threads[i].time;

Na wypadek gdybyś zamierzał wykorzystać ten program do mierzenia czasu startu wątkow w javie - czy mierzenia czegokolwiek.co te wątki robią.
To niestety nie mierzy on nic i nie ma szans na miarodajne mierzenie.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
0

Domyślam się, raczej nie zamierzam do niczego poważnego, w celach ciekawości bawię się stopwatchem. Mam jeszcze taki problem , że operacja którą podałeś chyba nie jest prawidłowa - threads[i] nie widzi pola time.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:4 minuty
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4709
0

Jakoś tak (troszkę koślawo wyszło - ale po linii najmniejszego oporu zmieniam)

Kopiuj
public class Main 
{
 
    public static void main(String[] args) throws InterruptedException 
    {
          double suma = 0; 
          MyThread threads[] = new MyThread[10];
          for (int i = 0 ; i < 10 ; i++)
          {
              threads[i] = new MyThread();
              new Thread(threads[i]).start();
              suma += threads[i].time;
           }
 
          System.out.println("Suma : " + suma);
    }
 
}

jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: Shalom
IC
jeszcze warto zauważyć że double (tak jak wszystkie inne prymitywy) nie jest thread-safe na czym można się przejechać
jarekr000000
Hej @immanuel_cunt write i read sum jest w jednym wątku, time jest volatile i mamy tylko w tym watku read. nie widzę jak można się przejechać.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.