Witam
Dopiero się uczę podstaw Javy, zacząłem ogarniać watki, napisałem prosty program do poeksperymentowania, ogólnie działa jednak nie do końca jak bym się tego spodziewał. w związku z czym mam parę pytań.
Kod mego programiku:
import java.util.Scanner;
class Fibonaci {
static long fibon(long n)
{
if (n<2)
return n;
else
return (fibon(n-1)+fibon(n-2));
}
}
class wateki implements Runnable {
Thread thrd;
wateki( String nazwa)
{
thrd=new Thread(this, nazwa);
}
public void run()
{
System.out.println(thrd.getName()+" rozpoczyna działanie");
System.out.println("podaj wartość dla "+ thrd.getName());
Scanner w = new Scanner (System.in);
long wartosc=w.nextLong();
System.out.println("wynik pracy "+thrd.getName()+" to "+ Fibonaci.fibon(wartosc));
}
}
public class watek
{
public static void main(String[] args)
{
wateki potomny1=new wateki("potomek1");
wateki potomny2=new wateki("potomek2");
wateki potomny3=new wateki("potomek3");
wateki potomny4=new wateki("potomek4");
potomny1.thrd.setPriority(Thread.NORM_PRIORITY-5);
potomny2.thrd.setPriority(Thread.NORM_PRIORITY-1);
potomny3.thrd.setPriority(Thread.NORM_PRIORITY+4);
potomny4.thrd.setPriority(Thread.NORM_PRIORITY+5);
potomny1.thrd.start();
potomny2.thrd.start();
potomny3.thrd.start();
potomny4.thrd.start();
}
}
Pytanie nr 1:
Komunikaty z prośbą o wpisanie wartości i z informacją o rozpoczęciu wątku na konsoli wyświetlają się tak jak by w chaotycznej kolejności co mnie nie dziwi, problem zaczyna się już po wyświetleniu wszystkich komunikatów gdy wątki zaczynają oczekiwać na wartości, mianowicie gdy kolejno podaje pierwszą, drugą, trzecią wartość nic się nie liczy dopiero po podaniu czwartej wartości gdy wszystkie wątki otrzymają wartość, rozpoczynają obliczenia jednocześnie, tak jak by czekały na siebie. Spodziewałem się raczej że pojedyncze wątki ruszą gdy otrzymają dla siebie wartość.
//widzę to po obciążeniu procesora.
Pytanie nr 2
Tutaj mam problem z priorytetami, nadałem wątką priorytety jednak pomimo tego wyniki są wyświetlane nie koniecznie z tymi priorytetami, na domiar tego gdy podawałem wartość 50 co zajmowało memu procesorowi około minuty to i tak wyniki były wyświetlane niemal że jednocześnie, powinny być chyba zauważalne odstępy czasu?
Pytanie nr 3
Liczbę wątków w programie zwiększyłem do czterech tak aby w pełni obciążyć mój czerto rdzeniowy Athlon, i tak jak był jeden watek to obciążenie w trakcie wykonywania było ok 27 %, dla dwóch wątków to trochę ponad 50 %.etc, co wydaje mi się zrozumiałe (cztery rdzenie=cztery wątki), tylko przy jednym wątku raczej się spodziewałem niemal całkowitego obciążenie pojedynczego rdzenia, ale jak się okazało w trakcie wykonywania pojedynczego wątku wszystkie rdzenie były wykorzystywane mniej więcej po równo.
Program napisałem w Eclipse dla Windows 7