JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 在thread中執行timertask遭遇的問題
causemx

什麼時候可以獨當一面...?



發文: 128
積分: 0
於 2010-03-24 11:19 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class tThread extends Thread {
  public void run() {
      TimerTask timertask = new TimerTask() {
        public void run() {
          System.out.println("hello");
        }
      };
      Timer timer = new Timer();
      timer.scheduleAtFixedRate(timertask, 0, 1000);
      try {
        Thread.sleep(5000);
      } catch (Exception e) {
        e.printStackTrace();
      }
  }
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    tThread t = new tThread();
    t.start();
  }
}


如上面程式所示,我希望每隔一秒就印出一個hello,然後五秒之後終止,
但是實際上執行之後,timertask完全不理會thread.sleep(5000)的條件,
持續的執行下去...
不曉得其中運作情形是如何,以及這個問題該如何下手


reply to postreply to post
無招勝有招
作者 Re:在thread中執行timertask遭遇的問題 [Re:causemx]
mylee





發文: 764
積分: 1
於 2010-03-24 11:26 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
睡 5秒是你的 main thread,timer task 當然不應該睡5秒。timer task 只執行 run() 裏叫它做的事。

reply to postreply to post
作者 Re:在thread中執行timertask遭遇的問題 [Re:mylee]
Kaworucloud





發文: 451
積分: 0
於 2010-03-24 12:05 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
mylee wrote:
睡 5秒是你的 main thread,timer task 當然不應該睡5秒。timer task 只執行 run() 裏叫它做的事。

不是喔
main thread 在啟動完一個 thread-A 後就結束了
睡五秒的是 thread-A,睡完後一樣結束
只留下 thread-A 在睡前建的 timer-thread 繼續在那邊跑
然後 timer-thread 不是 daemon thread,又沒人去結束 timer-thread,所以會一直跑下去

讓 timer-thread 成為 daemon thread 就能在 thread-A 也結束後便終止整個程式了
1
new Timer( true );


reply to postreply to post
巨乳は夢が詰まってるから大きい、貧乳はみんなに夢を与えているから小さいんだ!
作者 Re:在thread中執行timertask遭遇的問題 [Re:Kaworucloud]
mylee





發文: 764
積分: 1
於 2010-03-24 12:23 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
看太快,眼花了。Shock

reply to postreply to post
作者 Re:在thread中執行timertask遭遇的問題 [Re:Kaworucloud]
causemx

什麼時候可以獨當一面...?



發文: 128
積分: 0
於 2010-03-24 17:36 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝,我試試看!

reply to postreply to post
無招勝有招
作者 Re:在thread中執行timertask遭遇的問題 [Re:Kaworucloud]
causemx

什麼時候可以獨當一面...?



發文: 128
積分: 0
於 2010-03-24 19:29 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
設為true之後真的有效,
後來我又突發奇想,改寫了一下程式,
我希望輸出的結果是每隔五秒輸出一次結果,
於是我把程式改成:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.Timer;
import java.util.TimerTask;
 
public class tThread extends Thread {
  public void run() {
    while (true) {
      TimerTask timertask = new TimerTask() {
        public void run() {
          System.out.println("hello");
        }
      };
      Timer timer = new Timer(true);
      timer.scheduleAtFixedRate(timertask, 0, 1000);
      try {
        Thread.sleep(5000);
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        System.out.println("end");
      }
    }
  }
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    tThread t = new tThread();
    t.start();
  }
}


結果輸出變成了..

hello
hello
hello
hello
hello
hello
end
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
end
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
end

本來是一秒輸出一次的,現在第二循環就變成一秒輸出兩次,依此類推...
這實在不是我想要的結果,不知道要如何讓每個循環都是一秒輸出一次。


reply to postreply to post
無招勝有招
作者 Re:在thread中執行timertask遭遇的問題 [Re:causemx]
Kaworucloud





發文: 451
積分: 0
於 2010-03-24 21:10 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1
2
3
4
5
6
7
8
9
10
11
public void run(){
  while( true ){
    System.out.println( "hello" );
    try{
      Thread.sleep( 5000 );
    }
    catch( Exception e ){
      e.printStackTrace();
    }
  }
}


reply to postreply to post
巨乳は夢が詰まってるから大きい、貧乳はみんなに夢を与えているから小さいんだ!
作者 Re:在thread中執行timertask遭遇的問題 [Re:Kaworucloud]
causemx

什麼時候可以獨當一面...?



發文: 128
積分: 0
於 2010-03-24 21:44 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
如果一秒輸出一次真的這樣做就行了,
不過如果我想做的是每個5秒都輸出50個結果,
我改成下面這樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 public void run() {
    while (true) {
      TimerTask timertask = new TimerTask() {
        public void run() {
          System.out.println("hello");
        }
      };
      Timer timer = new Timer(true);
      timer.scheduleAtFixedRate(timertask, 0, 100);
      try {
        Thread.sleep(5000);
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        System.out.println("end");
      }
    }


出來的結果就像我剛才說的,第一個5秒50個,第二個5秒輸出了100個,依此類推下去..,
單純只用一個thread似乎無法達到這個結果。


reply to postreply to post
無招勝有招
作者 Re:在thread中執行timertask遭遇的問題 [Re:causemx]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2010-03-24 21:58 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
causemx wrote:
如果一秒輸出一次真的這樣做就行了,
不過如果我想做的是每個5秒都輸出50個結果,
我改成下面這樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 public void run() {
    while (true) {
      TimerTask timertask = new TimerTask() {
        public void run() {
          System.out.println("hello");
        }
      };
      Timer timer = new Timer(true);
      timer.scheduleAtFixedRate(timertask, 0, 100);
      try {
        Thread.sleep(5000);
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        System.out.println("end");
      }
    }


出來的結果就像我剛才說的,第一個5秒50個,第二個5秒輸出了100個,依此類推下去..,
單純只用一個thread似乎無法達到這個結果。


只需要使用 scheduleAtFixedRate 一次就可以達成重複排程。
1
2
3
4
5
6
7
8
9
public void run() {
      TimerTask timertask = new TimerTask() {
        public void run() {
          System.out.println("hello");
        }
      };
      Timer timer = new Timer(true);
      timer.scheduleAtFixedRate(timertask, 0, 100);
}


每 0.1 秒輸出一次不就是每 5 秒內輸出 50 次?


Duncan edited on 2010-03-24 22:04
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:在thread中執行timertask遭遇的問題 [Re:Duncan]
causemx

什麼時候可以獨當一面...?



發文: 128
積分: 0
於 2010-03-24 22:36 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我對問題的描述好像不太清楚= =",
我做了個示意圖如下:



我希望能藉由一個thread跟一個timertask來達成,每5秒得到一個結果,而每個結果包涵5*10個hello,而不能只靠一個排程的timertask來達成,雖然有點多此一舉...不過有特殊目的,但不曉得做不做的到


reply to postreply to post
無招勝有招
作者 Re:在thread中執行timertask遭遇的問題 [Re:causemx]
causemx

什麼時候可以獨當一面...?



發文: 128
積分: 0
於 2010-03-25 14:16 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
問題解決了,
只要在每次進入新的循環的時候把之前排程的timertask給cancel掉就可以了


reply to postreply to post
無招勝有招
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8