/ / Java Multithreading neočakávaný výsledok [duplikát] - java, multithreading

Java Multithreading neočakávaný výsledok [duplicitné] - java, multithreading

Učil som sa multithreading v Jave a meral som relatívne využitie CPU dvoch vlákien Ahoj a hľa na nižšie uvedenom kóde.

class Clicker implements Runnable{
long click=0;
Thread t;
private volatile boolean running =true;

public Clicker(int p)
{
t=new Thread(this);
t.setPriority(p);
}
public void run(){
while(running){
click++;
}
}

public void stop(){
running =false;
}

public void start(){
t.start();
}
}


public class HiLoPri {

public static void main(String[] args) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

Clicker hi = new Clicker(Thread.NORM_PRIORITY +2);
Clicker lo = new Clicker(Thread.NORM_PRIORITY -2);

lo.start();
hi.start();

try{
Thread.sleep(10000);
}catch(InterruptedException e){
System.out.println("Main Thread interrupted. ");
}

lo.stop();
hi.stop();

try{
hi.t.join();
lo.t.join();
}catch(InterruptedException e){
System.out.println("Interrupted Exception Caught");
}

System.out.println("Low priority : " + lo.click);
System.out.println("High priority : " + hi.click);
}

}

Tu sú výstupy pre rôzne priority:

  1. lo = NORM_PRIORITY -2 a ahoj = NORM_PRIORITY +2: Nízka priorita: 1725664879, Vysoká priorita: 1774465713 || Vysoká / Nízka = 1,02827
  2. lo = NORM_PRIORITY -4 a ahoj = NORM_PRIORITY +4: Nízka priorita: 2142378792, Vysoká priorita: 2180156175 || Vysoká / Nízka = 1,01763
  3. lo = NORM_PRIORITY a hi = NORM_PRIORITY: Nízka priorita: 2582216343, Vysoká priorita: 2581415280 || Vysoká / Nízka = 0,99968

Z výstupu 3 som v dvoch vláknach s rovnakou prioritou pochopil, že prvý z nich je o niečo väčší.

V prípade výstupu 1 a výstupu 2 pozrihodnoty priority. Keď sa rozdiel priority zvýšil, počet sa zvýšil. Ale keď nastavím rozdiel 0 (na výstupe 3), na rozdiel od vyššie uvedeného pozorovania, počty ukazujú nárast namiesto descrease.

Môžete vysvetliť prečo?

(Špecifikácie: Java SE 7, štvorjadrový procesor AMD A10 2,3 GHz a Windows 8)

odpovede:

1 pre odpoveď č. 1

Špecifikácia Java nezaručuje, že sa pri prideľovaní kvót vláknam zohľadňujú priority.

Každé vlákno má svoju prioritu.Keď existuje konkurencia na spracovanie zdroje, vlákna s vyššou prioritou sa zvyčajne vykonávajú v prednosť pred vláknami s nižšou prioritou. Takáto preferencia nie je, záruka, že vlákno s najvyššou prioritou bude vždy beží a priority vlákien nemožno použiť na spoľahlivú implementáciu vzájomné vylúčenie.


0 pre odpoveď č. 2

Priorita vlákna je iba naznačením operačného systému.Táto nápoveda, ak vôbec niečo urobí, pomôže OS rozhodnúť sa, ktoré vlákna by sa mali spustiť, keď musíte spustiť viac vlákien, ako máte logické CPU. Ak máte dostatok voľného CPU, aj vlákno s najnižšou prioritou pobeží, koľko chce.

Poznámka: na zvýšenie priority vlákna vo Windows musíte byť administrátor a v systéme Unix musíte byť root.