/ / Java Multithreading неочакван резултат [дубликат] - java, многоредово четене

Java Multithreading неочакван резултат [duplicate] - java, multithreading

Изучавах Multithreading в Java и макар да измервам относителната употреба на процесора от две нишки здрасти и ето по-долу код.

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

}

Ето резултатите от различни приоритети:

  1. lo = NORM_PRIORITY -2 и hi = NORM_PRIORITY +2: Нисък приоритет: 1725664879, Висок приоритет: 1774465713 || Висока / ниска = 1.02827
  2. lo = NORM_PRIORITY -4 и hi = NORM_PRIORITY +4: Нисък приоритет: 2142378792, Висок приоритет: 2180156175 || Висока / ниска = 1.01763
  3. lo = NORM_PRIORITY и hi = NORM_PRIORITY: Нисък приоритет: 2582216343, Висок приоритет: 2581415280 || Висока / ниска = 0,99968

От изход 3 разбрах в две нишки с равен приоритет, първата получава малко повече предпочитания.

В случай на изход 1 и изход 2, вижтестойности на приоритет. Когато разликата в приоритетите стана голяма, броя на броя се увеличава. Но когато задам разликата 0 (в изход 3), противно на горното наблюдение, броя показва увеличение вместо намаляване.

Можете ли да обясните защо?

(Спецификации: Java SE 7, AMD A10 четириядрен 2.3GHz и Window 8)

Отговори:

1 за отговор № 1

Спецификацията на Java не гарантира, че приоритетите се вземат предвид при присвояване на квота на нишки.

Всяка нишка има приоритет. Когато има конкуренция за обработка ресурси, нишките с по-висок приоритет обикновено се изпълняват в предпочитание към нишки с по-нисък приоритет. Такова предпочитание не е, обаче гаранция, че нишката с най-висок приоритет винаги ще бъде работи и приоритетите на нишката не могат да се използват за надеждно изпълнение взаимно изключване.


0 за отговор № 2

Приоритетът на нишката е само намек за ОС. Този намек, ако той изобщо прави нещо, ще помогне на ОС да реши кои нишки да се изпълняват, когато имате нужда от повече нишки, отколкото да имате логически процесори. Ако имате достатъчно безплатен процесор, дори нишката с най-нисък приоритет ще работи колкото иска.

Забележка: за да повишите приоритета на нишка в Windows, трябва да сте администратор, а в Unix трябва да бъдете root.