Dostęp do pola a get i set

0

Mam pewien problem. Poniżej kod:

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...

0
polgol napisał(a):
	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();

0

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

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?

0

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

0

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

0

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

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ąć?)

0

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


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()

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.

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.

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.

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.

0

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

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);
    }
 
}

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