Problem z uruchamianiem wątków

0

Witam uczę się wątków i napisałem sobie taką prostą symulacje:

package strzelcy;

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


public class Strzelec implements Runnable{
    private int cel;
    private int szybkosc;
    private int przeladowanie;
    private static int magazynek_max;
    private int magazynek;
    private int wynik;
    private final String nazwa;
   
    Strzelec(String nazwa, int cel, int szybkosc, int przeladowanie, int magazynek_max ){
        this.nazwa=nazwa;
        this.cel=cel;
        this.szybkosc=szybkosc;
        this.przeladowanie=przeladowanie;
        Strzelec.magazynek_max=magazynek_max;
        
    }
   
    private void przeladuj(){
        try {
            magazynek=magazynek_max;
            System.out.println("Strzelec "+nazwa+" przeładowuje magazynek");
            Thread.sleep((int)(Math.random())*100+przeladowanie*100);
        } catch (InterruptedException ex) {
            Logger.getLogger(Strzelec.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    private void strzelaj(){
        while(magazynek>0){
            try {
                magazynek--;
                if(Math.random()*100<=cel) wynik++;
                Thread.sleep((int)(Math.random())*10+szybkosc*100);
                
            } catch (InterruptedException ex) {
                Logger.getLogger(Strzelec.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
        int wynik(){
            return wynik;
        }
        
        private void przedstawsie(){
            System.out.println("Nazwa: "+nazwa);
            System.out.println("Celność: "+cel+"%");
            System.out.println("Szybkość: "+szybkosc+" sekund");
            System.out.println("Przeładowuje: "+przeladowanie+" sekund");
            System.out.println("Pojemność broni: "+magazynek_max+" kul");
        }
        
    @Override
    public void run(){
        przedstawsie();
        Thread.yield();
     while(true)   {
            przeladuj();
            Thread.yield();
            strzelaj();
            Thread.yield();
            System.out.println("Strzelec "+nazwa+" ma wynik: "+wynik());
     } 
    }
}

--------------------------------------------------------------------------------

package strzelcy;

public class Strzelcy {

    public static void main(String[] args) {
        // TODO code application logic here
        Strzelec celny= new Strzelec("Celny",40, 2, 10, 15);
        Strzelec szybki= new Strzelec("Szybki",20, 1, 10, 15);
        Thread wątekcelny = new Thread(celny);
        Thread wątekszybki = new Thread(szybki);
        wątekcelny.run();
        wątekszybki.run();
    }
}

wynik jest następujący:

run:
Nazwa: Celny
Celność: 40%
Szybkość: 2 sekund
Przeładowuje: 10 sekund
Pojemność broni: 15 kul
Strzelec Celny przeładowuje magazynek
Strzelec Celny ma wynik: 6
Strzelec Celny przeładowuje magazynek
Strzelec Celny ma wynik: 12
Strzelec Celny przeładowuje magazynek
Strzelec Celny ma wynik: 16
Strzelec Celny przeładowuje magazynek
Strzelec Celny ma wynik: 25
Strzelec Celny przeładowuje magazynek
BUILD STOPPED (total time: 17 seconds)

Zupełnie nie wiem, czemu nie aktywuje wątku "szybki".

0

Wątek startuje się przez start() a nie przez run()! Ty wcale nie odpaliłeś nowych wątków tylko wywołałeś metodę na obiekcie...

0

Tu właśnie widać jak źle została zaprojektowana klasy Thread i jak źle został nazwany interfejs Runnable.
Interfejs powinien się nazywać raczej Task (bo nim jest), a Thread nigdy nie powinien go implementować bo wątek nie jest zadaniem.
Takie błędy u początkujących zawsze będą się pojawiać dopóki w podręcznikach nie zarzuci się używania jednego i drugiego na rzecz nowych, lepiej zaprojektowanych elementów pakietu Concurrent.

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