banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows [Java Thread], vấn đề interrupt!  XML
  [Programming]   [Java Thread], vấn đề interrupt! 10/10/2008 03:21:08 (+0700) | #1 | 154638
[Avatar]
KozikiSama
Member

[Minus]    0    [Plus]
Joined: 26/05/2008 17:07:58
Messages: 5
Location: Lòng đất
Offline
[Profile] [PM]
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.
[Up] [Print Copy]
  [Question]   Re: [Java Thread], vấn đề interrupt! 12/10/2008 12:41:40 (+0700) | #2 | 154943
[Avatar]
MASM
Member

[Minus]    0    [Plus]
Joined: 09/10/2008 18:47:55
Messages: 2
Offline
[Profile] [PM]
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
[Up] [Print Copy]
  [Question]   Re: [Java Thread], vấn đề interrupt! 17/10/2008 04:38:48 (+0700) | #3 | 155505
[Avatar]
Side Winder
Member

[Minus]    0    [Plus]
Joined: 16/10/2008 00:36:41
Messages: 8
Offline
[Profile] [PM]
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 smilie??
[Up] [Print Copy]
  [Question]   Re: [Java Thread], vấn đề interrupt! 20/10/2008 21:21:11 (+0700) | #4 | 155906
[Avatar]
KozikiSama
Member

[Minus]    0    [Plus]
Joined: 26/05/2008 17:07:58
Messages: 5
Location: Lòng đất
Offline
[Profile] [PM]

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 smilie?? 


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.
[Up] [Print Copy]
  [Question]   Re: [Java Thread], vấn đề interrupt! 21/10/2008 05:32:47 (+0700) | #5 | 155949
lamer
Elite Member

[Minus]    0    [Plus]
Joined: 26/02/2008 13:28:49
Messages: 215
Offline
[Profile] [PM]
Code sai rõ ràng mà ở đó cứ nói không lầm, không sai smilie.

Sai chỗ nào thì mình hổng nói, tự tìm ra thì mới hiểu được chuyện.
[Up] [Print Copy]
  [Question]   Re: [Java Thread], vấn đề interrupt! 21/10/2008 08:25:01 (+0700) | #6 | 155969
StarGhost
Elite Member

[Minus]    0    [Plus]
Joined: 29/03/2005 20:34:22
Messages: 662
Location: The Queen
Offline
[Profile] [PM]
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.
[Up] [Print Copy]
  [Question]   Re: [Java Thread], vấn đề interrupt! 21/10/2008 11:11:07 (+0700) | #7 | 155983
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
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 smilie
[Up] [Print Copy]
  [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
[Profile] [PM]
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.
[Up] [Print Copy]
  [Question]   Re: [Java Thread], vấn đề interrupt! 31/10/2008 01:51:46 (+0700) | #9 | 157024
[Avatar]
zThienLongz
Member

[Minus]    0    [Plus]
Joined: 29/08/2006 10:09:05
Messages: 104
Location: World
Offline
[Profile] [PM] [WWW]
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).
[Up] [Print Copy]
  [Question]   Re: [Java Thread], vấn đề interrupt! 31/10/2008 05:33:52 (+0700) | #10 | 157056
StarGhost
Elite Member

[Minus]    0    [Plus]
Joined: 29/03/2005 20:34:22
Messages: 662
Location: The Queen
Offline
[Profile] [PM]

zThienLongz wrote:
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). 


Như đã nói ở trên, vấn đề có thể không liên quan đến interrupt handling. Tuy nhiên, nếu bồ thử step từng dòng thì chắc sẽ luôn cho kết quả đúng.

Note:edited.
Mind your thought.
[Up] [Print Copy]
  [Question]   Re: [Java Thread], vấn đề interrupt! 31/10/2008 10:17:20 (+0700) | #11 | 157077
[Avatar]
zThienLongz
Member

[Minus]    0    [Plus]
Joined: 29/08/2006 10:09:05
Messages: 104
Location: World
Offline
[Profile] [PM] [WWW]
Việc chạy step từng dòng là 1 điều ko tưởng trong lập trình đa luồng vì 1 vấn đề là ở đây có 2 luồng cùng chạy như vậy bồ quản lý 1 luồng thì luồng kia như thế nào . Và cha dù bồ có quản lý luôn cả 2 luồng đi chăng nữa (bằng cách set break point vào code 2 luồng ) thì làm sao bồ biết là cpu sẽ chạy luồng này trong bao lâu rùi thì nhường thời gian cho luồng kia.
[Up] [Print Copy]
  [Question]   Re: [Java Thread], vấn đề interrupt! 15/11/2008 13:12:39 (+0700) | #12 | 158963
[Avatar]
hakuso
HVA Friend

Joined: 04/01/2004 13:28:06
Messages: 287
Location: làng Đo Đo
Offline
[Profile] [PM]

zThienLongz wrote:
Việc chạy step từng dòng là 1 điều ko tưởng trong lập trình đa luồng vì 1 vấn đề là ở đây có 2 luồng cùng chạy như vậy bồ quản lý 1 luồng thì luồng kia như thế nào . Và cha dù bồ có quản lý luôn cả 2 luồng đi chăng nữa (bằng cách set break point vào code 2 luồng ) thì làm sao bồ biết là cpu sẽ chạy luồng này trong bao lâu rùi thì nhường thời gian cho luồng kia. 


Cách debug trong mutilthread tôi dùng là output message ra debug của windows rồi sau đó dùng chương trình debugviewer capture lại. Còn không có thể write message xuống Event Viewer cũng được. Không rõ java có support cách này hay không
Live, fight, work and study
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|