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:3 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:około 6 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
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:około 6 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
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:około 6 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
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:około 6 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
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:około 6 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
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ć.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)