[問題] 關於Threading

看板java作者 (BlackMatrix)時間14年前 (2010/03/07 10:00), 編輯推噓1(105)
留言6則, 3人參與, 最新討論串1/2 (看更多)
最近教授正在教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
我只能說 不同thread沒有用synchronized所起來的話
03/08 15:04, 1F

03/08 15:05, , 2F
永遠沒有人知道哪一個thread會先跑
03/08 15:05, 2F

03/09 04:47, , 3F
不過我有把Synchronized拿掉可是結果還是差不多
03/09 04:47, 3F

03/09 14:08, , 4F
就算用 synchornized ,還是沒辦法保證哪一個Thread會先跑.
03/09 14:08, 4F

03/10 09:33, , 5F
原來如此,難怪我自己又做了一堆例題都沒辦法測誰先跑
03/10 09:33, 5F

03/10 10:58, , 6F
Synchronized 只能保證同一時間只有一個Thread存取.
03/10 10:58, 6F
文章代碼(AID): #1BamYw1h (java)
討論串 (同標題文章)
文章代碼(AID): #1BamYw1h (java)