Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

JegoWysokosc

[Java]Tworzenie losowej liczby wątków i oczekiwanie na ich zakończenie

Rekomendowane odpowiedzi

Witam, tak dla sportu postanowiłem sobie po programować.

Wymyśliłem sobie, że napiszę program, który będzie tworzył losową liczbę wątków. Każdy wątek wykonuje 10 iteracji przez losowa ilość sekund. Stworzyłem klasę "Tworzenie wątków", która w zamyśle ma tworzyć losową liczbę wątków. Niby wszystko powinno działać ale wątki się nie tworzą. Gdzie popełniam błąd?

 

import java.util.logging.Level;
import java.util.logging.Logger;

class TworzenieWatkow implements Runnable{
   Thread t;
   public TworzenieWatkow() {
       t = new Thread(this);
       t.start();
   }

   public void run(){
       int ilosc_watkow = (int)Math.random()*10;
       for(int i = 0; i < ilosc_watkow;i++){
           new Watek(String.valueOf(i));
       }
   }

}

public class Watek implements Runnable{
   Thread t;
   public Watek(String name){
       t = new Thread(this,name);
       System.out.println("Utworzono watek: "+t.getName());
       t.start();        
   }
   public void run(){
       int sleeptime = (int)(Math.random() * 1000);
       for(int i = 0;i < 10;i++){
           try {
               Thread.sleep(sleeptime);
           } catch (InterruptedException ex) {
               Logger.getLogger(Watek.class.getName()).log(Level.SEVERE, null, ex);
           }
       }
       System.out.println("Koniec watku "+t.getName());
   }


   public static void main(String[] args) {
           TworzenieWatkow tw = new TworzenieWatkow();
       try {

           System.out.println("Oczekiwanie na zakonczenie watkow");
           tw.t.join();

       } catch (InterruptedException ex) {
           Logger.getLogger(Watek.class.getName()).log(Level.SEVERE, null, ex);
       }
       System.out.println("Koniec pracy wątków");
   }
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

może spróbuj tak:

 

Watek w1 = new Watek();
(new Thread(w1)).start();

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

to takei thread.start() to już od javy se5 nie jest zalecane jako metoda startowania wątków. Powinno używać się wykonawców.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam, tak dla sportu postanowiłem sobie po programować.

Wymyśliłem sobie, że napiszę program, który będzie tworzył losową liczbę wątków. Każdy wątek wykonuje 10 iteracji przez losowa ilość sekund. Stworzyłem klasę "Tworzenie wątków", która w zamyśle ma tworzyć losową liczbę wątków. Niby wszystko powinno działać ale wątki się nie tworzą. Gdzie popełniam błąd?

 

import java.util.logging.Level;
import java.util.logging.Logger;

class TworzenieWatkow implements Runnable{
   Thread t;
   public TworzenieWatkow() {
       t = new Thread(this);
       t.start();
   }

   public void run(){
       int ilosc_watkow = (int)Math.random()*10;
       for(int i = 0; i < ilosc_watkow;i++){
           new Watek(String.valueOf(i));
       }
   }

}

public class Watek implements Runnable{
   Thread t;
   public Watek(String name){
       t = new Thread(this,name);
       System.out.println("Utworzono watek: "+t.getName());
       t.start();        
   }
   public void run(){
       int sleeptime = (int)(Math.random() * 1000);
       for(int i = 0;i < 10;i++){
           try {
               Thread.sleep(sleeptime);
           } catch (InterruptedException ex) {
               Logger.getLogger(Watek.class.getName()).log(Level.SEVERE, null, ex);
           }
       }
       System.out.println("Koniec watku "+t.getName());
   }


   public static void main(String[] args) {
           TworzenieWatkow tw = new TworzenieWatkow();
       try {

           System.out.println("Oczekiwanie na zakonczenie watkow");
           tw.t.join();

       } catch (InterruptedException ex) {
           Logger.getLogger(Watek.class.getName()).log(Level.SEVERE, null, ex);
       }
       System.out.println("Koniec pracy wątków");
   }
}

To nie ma prawa zadziałać. Ale z bardzo głupiego powodu:

kolejność operatorów: int ilosc_watkow = (int)Math.random()*10;

najpierw jest Math.random(), który zawsze daje wynik <1, potem (int), który ten wynik konwertuje do 0 co pomnożone przez 10 daje 0, ergo żaden wątek się nie utworzy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To nie ma prawa zadziałać. Ale z bardzo głupiego powodu:

kolejność operatorów: int ilosc_watkow = (int)Math.random()*10;

najpierw jest Math.random(), który zawsze daje wynik <1, potem (int), który ten wynik konwertuje do 0 co pomnożone przez 10 daje 0, ergo żaden wątek się nie utworzy

Faktycznie, nie zauważyłem. Dziękuję za pomoc:-)

 

A tak kontynuując temat...

 

Poprzednia wersja tego programu wyglądała mniej więcej tak (piszę z pamięci):

Klasa Watek bez zmian

 

    public static void main(String[] args) {
       int ilosc_watkow = (int) Math.random() * 10;

       //Wiem, ze to mozna na listach zrobic ale nie o to tu chodzi...
       //tablica watkow
       Watek[] w = new Watek[ilosc_watkow];

       // Tworzenie watkow
       for(int i = 0; i < w.length;i++){
           w[i] = new Watek(String.valueOf(i));
       }
       // Oczekiwanie na zakonczenie wszystkich watkow
       for(int i = 0;i < w.length;i++){
           try {
               w[i].t.join();
           } catch (InterruptedException ex) {
               Logger.getLogger(Watek.class.getName()).log(Level.SEVERE, null, ex);
           }
       }
   }

To działało wyśmienicie ale nie podobało mi się to, że trzeba było za pomocą pętli czekać na zakończenie wątków. Stąd się wziął mój pomysł stworzenia wątku który by tworzył wątki (wiem, mało logicznie to brzmi)

 

Jak zrobić żeby wątek główny czekał na zakończenie innych wątków bez użycia pętli?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

klepnij w google notify i wait

Akurat zasada działania notify i wait to nie problem, miałem na myśli podpowiedź w stylu "Zawieś wątek X, a potem sprawdź stan wątku Y..." :-)

 

W każdym razie dziękuję za wszystkie podpowiedzi :-)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

  • Tematy

  • Odpowiedzi

    • Ciekawy filozoficzny post, ja to odbieram inaczej - 9800X3D potrafi być 30% szybszy od 7800X3D i to przyrost w 18 miesięcy. Jeżeli upgrade dokonujesz w tej samych "widełkach" wydajnościowych zmieniajac starsze i5 na nowsze i5 to przyrost potrafi być przez 2 lata mniejszy niż nawet 5% za to energetycznie bywa że jest 30% lepiej, ostatecznie jest to jakaś ewolucja - pamiętaj że rozwój technologii jest iteratywny i polega na małych przyrostach które ostatecznie składają się na coś wielkiego ale ostatecznie masz rację - i7-2600 do dzisiaj może stanowić podstawę użytecznego komputera biurowego, skylake posłuszy pewnie i do 2030 w takich celach. Rasteryzacja w kartach graficznych faktycznie stoi nieco w miejscu, nVidia próbuje zrewolucjonizować rynek vendorlockowymi technikami jak swoje DLSSy, ostatecznie doprowadzi to do stagnacji gdzie bez zamydlonego ekranu nie pogramy w 4K, silniki graficzne też nie rozwijają się w oczekiwanym tempie - unity rozpadło się przez kiepski zarząd, unreal engine 5 to król mikroopóźnień, od zakończenia akceleracji sprzętowej dźwięku w windows vista (okolice 2007) nie było w audio żadnej rewolucji a wręcz ewolucji - id Tech to do dzisiaj jedyny engine który potrafi wyrysować łuk a nie koła z nakładanych trójkątów... Także sygnałów że branża kuleje nigdy nie brakowało - grunt to realizować swoje cele i jak tak jak ja od lat 2000 celujesz w średnią półkę cenową - szukać takich upgrade które faktycznie coś dają no i mieć świadomość że rtx 5090 to będzie 600w potwór z gddr7 i ceną na poziomie 12000 pln, takiej wydajności w kartach do 2000zł nie zobaczymy do 2030r. Pamiętam WOW jakie zrobił na mnie Teoria Chaosu splinter cella (mądrze zaprogramowana gra działająca również na konsolach) Far Cry 1 (był nieziemski na premierę) Crysis wyrywał z butów (8800gtx ledwo dawał radę), wszystko potem to sidegrade z momentami które pokazywały że 200 mln usd budżetu może dać jakościowy tytuł jak Red Dead 2, przez ostatnie 20 lat dobrych gier pctowych nie brakowało ale większość to ciągły sidegrade niepotrzebujący najmocniejszych sprzętów, dobieranie timingów pamięci to zawsze była nieco sztuka dla sztuki
    • Na ITH podobna wolność słowa jak na X/Twitterze. No cóż, trzeba będzie po prostu listę ignorowanych wydłużyć  
    • Tak, ale są związane z usługą udostępnienia platformy z ramienia podmiotu X. W tym wypadku RASP. Jeśli treść, nawet przerobioną na anonimową, przetwarzać zacząłby ktoś inny, nie wiem czy przypadkiem nie potrzeba uzyskać ponownie zgody na przetwarzanie wtórne/dziedziczne. Być może bezpośrednio z RASP, ale już stwierdzono, że nie ma takiej opcji. Głośno myślę jedynie, nie wczytywałem się tak głęboko w przepisy. Ok, ale co jeśli posty zawierają informacje mogące przyczynić się do ustalenia tożsamości piszącego/piszących? Tu już robi się niestety grubiej.    
    • Ja odpowiem bo nie wybieram się na tamto forum. Zależy czy masz boxy, gwarancję i jak szybko chcesz sprzedać ale coś koło 2100.
    • Polecam zapytać na Forum ITHardware.pl tutaj już raczej nikt ci nie odpowie, to forum się zamyka i wszyscy przeszli na ith.   @MuziPL .
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...