[問題] 關於Threading
最近教授正在教Threading, 班上的好像高中都已經學過了, 教授以超快速的速度帶過
一大堆東西,還好我有一些比較可靠的書本可以幫我
可是有一點, Threading, 書本上教得很模糊
(Just Java 2 6e, Data Structures and Problem Solving Using Java 3e)
我不太確定我這樣寫的對不對, 以下是某些Code:
public class Main
{
public static void main(String[] args)
{
new ThreadDemo1().start();
System.out.println("Hello from Main!");
System.out.println("Program is now finished");
}
}
class ThreadDemo1 extends Thread
{
public void run()
{
try
{
sleep(500);
}
catch (InterruptedException ex)
{
Logger.getLogger(ThreadDemo1.class.getName()).log(Level.SEVERE,
null, ex);
}
System.out.println("ThreadDemo1 saying howdy!");
}
}
我有個問題就是說:
如果跑這個code, 會變成
Hello From Main
Program is now finsihed
ThreadDemo1 saying Howdy
會變成這樣是因為Thread把Main跟ThreadDemo1各分成一個Thread,然後因為Main的Thread
先跑完,在跑ThreadDemo1的Thread才會這樣嗎?
另一個問題是, 如果我要找一個素數(Prime Number)
public class Main
{
public static void main(String[] args)
{
for (int i = 0; i<1000; i++)
{
new ThreadDemo2(i).start();
}
}
}
class ThreadDemo2 extends Thread
{
int number;
ThreadDemo2(int primeTest)
{
number = primeTest;
}
public void run()
{
boolean isPrime = true;
for (int i = 2; i <= Math.sqrt(number)&& isPrime; i++)
{
if (number%1 == 0)
{
isPrime=false;
}
}
if(isPrime)
{
System.out.println(number+ " is a prime");
}
}
}
如果利用這個Code跑的話, 他出來的數字都不是一個一個一個i=1,i=2,i=3下去
請問是因為Thread是分成i=1,i=2,i=3同時在跑的嗎?
如果我有225個processes, 那一次性可以算225個prime number?
如果我用sleep(在Demo 1)用這樣的寫法呢?
最後一個大問題,
public class Main
{
public static void main(String[] args)
{
new ThreadDemo5(5).start();
new ThreadDemo6(6).start();
}
}
class Dummy
{
static Integer stuff = new Integer(0);
}
class Dummy2
{
static Integer stuff = new Integer(0);
}
class ThreadDemo5 extends Thread
{
int id;
ThreadDemo5(int n)
{
id = n;
}
public void run()
{
for (int i=0; i<500; i++)
{
synchronized (Dummy2.stuff)
{
yield();
synchronized (Dummy.stuff)
{
System.out.print(id);
}
}
}
}
}
class ThreadDemo6 extends Thread
{
int id;
ThreadDemo6(int n)
{
id = n;
}
public void run()
{
for (int i=0; i<500; i++)
{
synchronized (Dummy2.stuff)
{
yield();
synchronized (Dummy.stuff)
{
System.out.print(id);
}
}
}
}
}
Dummy的作用是...
synchronized的原意是要只讓一個Thread跑的意思嗎?
可是為什麼跑這段Code的時候會...
變成5555556666666555555666666, 不是應該是555555556666666嗎?
yield的作用是把Thread暫停一下讓其他Thread跑, 為什麼如果我把yield拿掉的話
結果都不是持續性的55555555666666666而是55665555566655555666段開的呢?
謝謝大家的幫忙
以下是Code:
http://nopaste.csie.org/670f3
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 173.56.121.140
※ 編輯: BlackMatrix 來自: 173.56.121.140 (03/07 10:03)
推
03/08 15:04, , 1F
03/08 15:04, 1F
→
03/08 15:05, , 2F
03/08 15:05, 2F
→
03/09 04:47, , 3F
03/09 04:47, 3F
→
03/09 14:08, , 4F
03/09 14:08, 4F
→
03/10 09:33, , 5F
03/10 09:33, 5F
→
03/10 10:58, , 6F
03/10 10:58, 6F
討論串 (同標題文章)