Discussion:
[問題] 父親要怎麼被子thread叫醒?
(时间太久无法回复)
專心K書?
2007-07-28 09:49:06 UTC
Permalink
如題~
請問一下有方法可以做到嗎?
我查過上面的文章都是二個thread之間互相溝通~
那有沒有讓子thread 叫醒父親的方法@@?

我講一下我要做的事好了@@~
我要讓父親和子THREAD溝通~
我是想用socket自己連自己~
所以父要先等子thread被輸入資料後才能動作~
但是如果沒有機制讓父等待的話~
那麼父會吃掉很多資源讓整個視窗變超慢....
如果有辨法做到類似的動作也請告訴我~謝謝@@~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.228.157.98
※ 編輯: workworkwork 來自: 220.228.157.98 (07/28 18:09)
專心K書?
2007-07-29 00:02:56 UTC
Permalink
※ 引述《TonyQ (骨頭)》之銘言:
: 兩個THREAD互相溝通就行啦
: 最簡單的作法
: 你可以 lock 其中一個thread
: 直到收到另一個thread的訊息在解鎖就好了
: ex
: boolean isLock=false;
: void lock(){
: isLock=true;
: while(isLock){
: try{
: Thread.sleep(1000);
: }catch(Exception e){
: }
: }
: }
: void unlock(){
: isLock=false;
: }
: x
: x
: x
: lock(); <<此時卡住 等另一個thread訊息送到在做unlock
: 以上這可能可以參考
: 這些看你的實作 應該不難做@@
但是我不是二個thread要互相溝通啊@@~
我是下面的情況@@~
在A程式中執行B.start();
然後我想做的是讓A停下來等B的訊息進來~
請問一下這樣有方法嗎?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.228.157.98
骨頭
2007-07-28 10:30:07 UTC
Permalink
※ 引述《workworkwork (專心K書?)》之銘言:
: 如題~
: 請問一下有方法可以做到嗎?
: 我查過上面的文章都是二個thread之間互相溝通~
: 那有沒有讓子thread 叫醒父親的方法@@?
: 我講一下我要做的事好了@@~
: 我要讓父親和子THREAD溝通~
: 我是想用socket自己連自己~
: 所以父要先等子thread被輸入資料後才能動作~
: 但是如果沒有機制讓父等待的話~
: 那麼父會吃掉很多資源讓整個視窗變超慢....
: 如果有辨法做到類似的動作也請告訴我~謝謝@@~

兩個THREAD互相溝通就行啦


最簡單的作法
你可以 lock 其中一個thread
直到收到另一個thread的訊息在解鎖就好了

ex

boolean isLock=false;

void lock(){
isLock=true;
while(isLock){
try{
Thread.sleep(1000);
}catch(Exception e){
}
}
}
void unlock(){
isLock=false;
}


x
x
x
lock(); <<此時卡住 等另一個thread訊息送到在做unlock

以上這可能可以參考
這些看你的實作 應該不難做@@

--
 ▄▅▆▇███▇▆▅▄▃        ╰┼╯─╮ ╮       
 ◥███████████◣       ╰┼╯=│=│         
◥██████───────◣    *. ╯  ╯ ╯  物 語 .*
 ◥███████──────◣ ~ ◢◣             ◢◣
 ◥██████───────◤   ◥◤*  空白的世界.翼 *◥◤
  ◥██▁▂▃▄▅▆▇███▆▅▄▃▂▂~telnet://tony1223.no-ip.info

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.124.15.165
學無止境,啥時才摔到底?
2007-07-29 03:07:05 UTC
Permalink
※ 引述《workworkwork (專心K書?)》之銘言:
: ※ 引述《TonyQ (骨頭)》之銘言:
: : 兩個THREAD互相溝通就行啦
: : 最簡單的作法
: : 你可以 lock 其中一個thread
: : 直到收到另一個thread的訊息在解鎖就好了
: : [中略]
: : 以上這可能可以參考
: : 這些看你的實作 應該不難做@@
: 但是我不是二個thread要互相溝通啊@@~
: 我是下面的情況@@~
: 在A程式中執行B.start();
: 然後我想做的是讓A停下來等B的訊息進來~
: 請問一下這樣有方法嗎?

我想,你必須釐清你是應該用 method,或只是為了用 thread 而 thread...

若是 thread....
你的 B 物件(子)要有訊息給 A (父),再怎樣也要中間有可以溝通的物件,
也就是將被 B 所改變的值,或是 B 所執行的某個階段的 flag 在改變後讓
A 能取得。注意! 這是你要在 B Thread 尚未執行結束或是執行某個定點時
讓 A 由 sleep 恢復為 active 的做法。

若你要的只是 B Thread 結束之後才繼續執行 A ,哪麼直接用 join 就好了。

如果你用的是 join,就意義上來說,你的需求與呼叫一個 B method 沒有多
大的差異(如果你只有一個子Thread),用 method 其實比較實際些。

回頭看看現實面,你要等待一個 Thread 結束,是人工來控制比較好,或是
採用 join 其實見仁見智,但有時候你會發現,用 join 並不那麼的理想。

譬如要在 Midlet 中使用 HttpConnection,許多手機或模擬器會出現詢問畫
面,要你確認是否接受付費連線,而 HttpConnection 合法的使用方式是另
開一個 thread 來使用,但詢問畫面卻是由 Midlet 的主 Thread 來控制,
想當然爾,若你使用了join,整隻程式就會陷入 dead lock。

若這篇能讓你解決問題或是有更好的做法,請記得回來提供你解決方案回饋
給大家參考喔!

--
No Dying Skills, ● - Dame! New tech...
but Lazy Users. .\)
http://www.javaworld.com.tw/roller/page/morris﹒ ︵ √\ ___________________

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.74.120.71
專心K書?
2007-07-29 06:17:34 UTC
Permalink
: 我想,你必須釐清你是應該用 method,或只是為了用 thread 而 thread...
: 若是 thread....
: 你的 B 物件(子)要有訊息給 A (父),再怎樣也要中間有可以溝通的物件,
: 也就是將被 B 所改變的值,或是 B 所執行的某個階段的 flag 在改變後讓
: A 能取得。注意! 這是你要在 B Thread 尚未執行結束或是執行某個定點時
: 讓 A 由 sleep 恢復為 active 的做法。
: 若你要的只是 B Thread 結束之後才繼續執行 A ,哪麼直接用 join 就好了。
: 如果你用的是 join,就意義上來說,你的需求與呼叫一個 B method 沒有多
: 大的差異(如果你只有一個子Thread),用 method 其實比較實際些。
: 回頭看看現實面,你要等待一個 Thread 結束,是人工來控制比較好,或是
: 採用 join 其實見仁見智,但有時候你會發現,用 join 並不那麼的理想。
: 譬如要在 Midlet 中使用 HttpConnection,許多手機或模擬器會出現詢問畫
: 面,要你確認是否接受付費連線,而 HttpConnection 合法的使用方式是另
: 開一個 thread 來使用,但詢問畫面卻是由 Midlet 的主 Thread 來控制,
: 想當然爾,若你使用了join,整隻程式就會陷入 dead lock。
: 若這篇能讓你解決問題或是有更好的做法,請記得回來提供你解決方案回饋
: 給大家參考喔!
概念我瞭解了~
先說聲感謝m(_._)m
唯一不瞭解的二點是~
1.
如何由A SLEEP?
是要用super.wait();嗎@@?
但他一直說current thread not owner
我先說一下我整個程式的架構吧~
我是由最先的main來史瑞德(thread)二個.....東東?不知用什麼計量單位Orz~
然後一個來接收網路訊息~(A)
另一個來讓使用者操作~(B)
而B可能會再史瑞德一個子視窗讓使用者操作~
所以我想SLEEP的人是B~
(好像很複雜Orz)

2.
什麼叫method?
我爬過上面的文和精華區都沒有解釋....

SORRY~我是新手Orz~
現在在寫的是專題的程式~
之前原本一直想用C的(畢竟寫了3年)~
但組員一直說要用JAVA~
(JAVA我只寫過4支程式而已Orz)
所以我只有OO的概念沒有JAVA的概念....

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.228.157.98
學無止境,啥時才摔到底?
2007-07-29 09:41:14 UTC
Permalink
※ 引述《workworkwork (專心K書?)》之銘言:
: 1.
: 如何由A SLEEP?
: 是要用super.wait();嗎@@?
: 但他一直說current thread not owner
: 我先說一下我整個程式的架構吧~
: 我是由最先的main來史瑞德(thread)二個.....東東?不知用什麼計量單位Orz~
: 然後一個來接收網路訊息~(A)
: 另一個來讓使用者操作~(B)
: 而B可能會再史瑞德一個子視窗讓使用者操作~
: 所以我想SLEEP的人是B~
: (好像很複雜Orz)

簡單敘述適合只有 C 經驗的做法:
Step 1. 在 main thread start A 與 B 之後,用 join 讓 main 不會跑到底。
(如果後面沒東西就沒差了!)
Step 2. 若在 A 裏頭撰寫接收端,先把讀入串流的動作包在迴圈裏頭。
Step 3. 參考前面TonyQ的程式碼,使用Thread.sleep(1000),讓每執行一次迴圈
就睡一秒,給其他程式使用資源的機會。
(其他省略....)

至於 wait(),這是等待某個物件呼叫 notify() 或等待結束物件使用權的 method,
一定要搭配 synchronized 才能發揮應有的效果。此外,看你的敘述,你要 wait 的
不是 super (main thread),應該是 A 才對。 (這部分才需要 Java 經驗)

建議你可以向咕狗調閱關鍵字 java synchronized thread

: 2.
: 什麼叫method?

method(方法) - 意近 C 的 function。

懶人造句:我一聽那個正妹把 method 稱做 function,就知道我靠 Java 領好人卡
的機會又來了。

--
No Dying Skills, ● - Dame! New tech...
but Lazy Users. .\)
http://www.javaworld.com.tw/roller/page/morris﹒ ︵ √\ ___________________

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.129.77.181

Loading...