[Programming] [Java Thread], vấn đề interrupt! |
10/10/2008 03:21:08 (+0700) | #1 | 154638 |
|
KozikiSama
Member
|
0 |
|
|
Joined: 26/05/2008 17:07:58
Messages: 5
Location: Lòng đất
Offline
|
|
Tôi có đoạn code sau
Code:
class IncrementalThread implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.err.println("interrupt catched");
}
System.out.print("1 ");
System.out.print("2 ");
System.out.print("3 ");
System.out.print("4 ");
System.out.print("5 ");
System.out.print("6 ");
System.out.print("7 ");
System.out.print("8 ");
System.out.print("9 ");
System.out.println("10 ");
}
}
}
public class UseThread {
public static void main(String args[]) {
Thread t = new Thread(new IncrementalThread());
t.start();
for(int i=0;i<3;i++)
{
try
{
Thread.sleep(100);
t.interrupt();
}
catch(InterruptedException e){}
}
}
}
khi chạy cho ra kết quả
Code:
1 2 3 4 5 6 7 8 9 10
interrupt catched
1 2 interrupt catched (***)
3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
interrupt catched
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
.......
Vấn đề là ở dòng (***), theo tôi thì Exception phải xảy ra trong khối try.. catch chứ, tại sao ở ngoài rồi mà vẫn bắt Exception? xin mọi người giải thích dùm. |
|
|
|
|
[Question] Re: [Java Thread], vấn đề interrupt! |
12/10/2008 12:41:40 (+0700) | #2 | 154943 |
|
MASM
Member
|
0 |
|
|
Joined: 09/10/2008 18:47:55
Messages: 2
Offline
|
|
Tôi xin mạo muội tr lời bạn như sau:
+ Đi từ void main bạn thực thi t.start() ->void run() được thực thi->in ra 1 2 3... 10
+Trong khi void run() đang chạy thì nhân lúc thằng này ngủ thread.sleep(1000) thì thằng:
for(int i=0;i<3;i++)
{
try
{
Thread.sleep(100);
t.interrupt();
}
catch(InterruptedException e){}
}
thực thi -> dua ra ngoại lệ t.interrupt();
khi thằng vong lặp nay ngủ trong 100ms thằng run() in ra được 1 2 rồi lại đến thằng vòng lặp đưa ra ngoại lệ -> ngủ ->run() in nốt 3->10->vòng lắp đua ra ngoại lệ (i=2 hết)
+bây giờ chỉ còn thăng run chạy thôi
Nếu chương trình chạy đúng như bác nói thì theo em là như vậy ko biết có đúng ko |
|
|
|
|
[Question] Re: [Java Thread], vấn đề interrupt! |
17/10/2008 04:38:48 (+0700) | #3 | 155505 |
|
Side Winder
Member
|
0 |
|
|
Joined: 16/10/2008 00:36:41
Messages: 8
Offline
|
|
bạn có nhầm k vậy??
Sao khi mình chạy thì nó chỉ ra như vậy
interrupt catched
1 2 3 4 5 6 7 8 9 10
interrupt catched
1 2 3 4 5 6 7 8 9 10
interrupt catched
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
...
Chứ không có cái ở giữa 1 2 như của bạn..
Với lại theo cái đoạn code của bạn thì trong cái hàm for nó chỉ có sleep 100, còn trên kia là 1000 thì những thread được tạo ra sẽ k có lý do gì lại có cái interrupt catched ở giữa đó được ?? |
|
|
|
|
[Question] Re: [Java Thread], vấn đề interrupt! |
20/10/2008 21:21:11 (+0700) | #4 | 155906 |
|
KozikiSama
Member
|
0 |
|
|
Joined: 26/05/2008 17:07:58
Messages: 5
Location: Lòng đất
Offline
|
|
Side Winder wrote:
bạn có nhầm k vậy??
Sao khi mình chạy thì nó chỉ ra như vậy
interrupt catched
1 2 3 4 5 6 7 8 9 10
interrupt catched
1 2 3 4 5 6 7 8 9 10
interrupt catched
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
...
Chứ không có cái ở giữa 1 2 như của bạn..
Với lại theo cái đoạn code của bạn thì trong cái hàm for nó chỉ có sleep 100, còn trên kia là 1000 thì những thread được tạo ra sẽ k có lý do gì lại có cái interrupt catched ở giữa đó được ??
không lầm đâu bạn, cái này kết quả nó ra khác nhau ở mỗi lần chạy(do hdh đang chạy các process khác chăng??), bạn chạy mấy lần thì chắc có interrupt ở giữa chừng. hoặc có thể tăng vòng for lên 10 lần chẳng hạn. |
|
|
|
|
[Question] Re: [Java Thread], vấn đề interrupt! |
21/10/2008 05:32:47 (+0700) | #5 | 155949 |
lamer
Elite Member
|
0 |
|
|
Joined: 26/02/2008 13:28:49
Messages: 215
Offline
|
|
Code sai rõ ràng mà ở đó cứ nói không lầm, không sai .
Sai chỗ nào thì mình hổng nói, tự tìm ra thì mới hiểu được chuyện. |
|
|
|
|
[Question] Re: [Java Thread], vấn đề interrupt! |
21/10/2008 08:25:01 (+0700) | #6 | 155969 |
StarGhost
Elite Member
|
0 |
|
|
Joined: 29/03/2005 20:34:22
Messages: 662
Location: The Queen
Offline
|
|
Không hiểu gì về hoạt động của java, nhưng tớ đoán vấn đề nằm ở từ "stream". |
|
Mind your thought. |
|
|
|
[Question] Re: [Java Thread], vấn đề interrupt! |
21/10/2008 11:11:07 (+0700) | #7 | 155983 |
|
secmask
Elite Member
|
0 |
|
|
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
|
|
1 2 3 4 5 6 7 8 9 10
interrupt catched
1 2 interrupt catched (***)
3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
interrupt catched
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
.......
các bác chú ý chỗ này xem |
|
|
|
|
[Question] Re: [Java Thread], vấn đề interrupt! |
21/10/2008 11:37:53 (+0700) | #8 | 155987 |
nbthanh
HVA Friend
|
Joined: 21/12/2001 14:51:51
Messages: 429
Offline
|
|
t.interrupt(); sẽ send tín hiệu interrupt đến thread và thread sẽ ngừng chạy.
Tuy nhiên, nếu tín hiệu được send tới trong khi đoạn code này đang chạy:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.err.println("interrupt catched");
}
Thì thread sẽ không ngừng vì bạn đã "catch" nó rồi...bỏ qua tín hiệu đó luôn. |
|
|
|
|
[Question] Re: [Java Thread], vấn đề interrupt! |
31/10/2008 01:51:46 (+0700) | #9 | 157024 |
|
zThienLongz
Member
|
0 |
|
|
Joined: 29/08/2006 10:09:05
Messages: 104
Location: World
Offline
|
|
Mình có 1 số chỗ thắc mắc ở trong đoạn code trên.
Thứ nhất : khi thread main tạo ra 1 thread mới t thì thread t có mức ưu tiên kế thừa từ mức ưu tiên của thread main. Khi gọi t.start() thì thread t đc nạp vào hàng đợi ưu tiên để chờ đc thực thi (theo nguyên tắc hàng đợi ưu tiên thì t phải nằm sau thread main) nhưng mình test thì thấy khi gọi method start() thì thread main dừng lại và thread t đc thực hiện.
Thứ 2: khi method t.start() đc gọi thì thread t ban đầu sẽ sleep(1000) rơi vào trạng thái block.
khi đó thread main đc thực hiện và vào vòng lặp for rùi sleep(100) như vậy là cả 2 thread đều rơi vào trạng thái block nhưng vì thread main chỉ ngủ có 100ms nên nó trở lại trạng thái runable trước vào gọi method t.interrupt() như vậy thì làm cho thread t đang ở trạng thái block sẽ sinh ra ngoại lệ InterruptedException và in ra dòng "interrupt catched" như vậy kết quả đầu tiên phải là "interrupt catched" chứ sao lại là 1 2 3 ... đc ( cái này mình đã chạy thử code nhưng ko hiểu sao nó in ra như vậy). |
|
|
|
|
|