java applet 內 thread start 同 stop 問題

  1. /*<applet code="StopWatchApplet" width="400" height="200"></applet>*/


  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.applet.*;
  5. import java.awt.event.*;


  6. public class StopWatchApplet extends Applet implements Runnable, ActionListener {
  7.         private TextField tfSecond, tfMinute;
  8.         private Label lbSecond, lbMinute;
  9.         private Button btStart, btStop, btReset;
  10.         private Thread clockThread = null;

  11.         private int second, minute;
  12.        
  13.         public void init() {
  14.                 lbMinute = new Label("Minute:");
  15.                 lbSecond = new Label("Second:");
  16.                 tfMinute = new TextField(2);
  17.                 tfSecond = new TextField(2);
  18.                 btStart = new Button("Start");
  19.                 btStop = new Button("Stop");
  20.                 btReset = new Button("Reset");
  21.                 add(lbMinute);
  22.                 add(tfMinute);               
  23.                 add(lbSecond);
  24.                 add(tfSecond);
  25.                 add(btStart);
  26.                 add(btStop);
  27.                 add(btReset);
  28.                 btStart.addActionListener(this);
  29.                 btStop.addActionListener(this);
  30.                 btReset.addActionListener(this);
  31.         }
  32.         public void start() {
  33.                 reset();
  34.         }
  35.         public void stop() {
  36.                 clockThread = null;
  37.         }
  38.         public void run() {
  39.                
  40.                 // Put your code here       
  41.                 while (clockThread != null){
  42.                         timeTick();
  43.                         tfMinute.setText(""+minute);
  44.                         tfSecond.setText(""+second);
  45.                         try {
  46.                         Thread.currentThread().sleep(1000);
  47.                         } catch (Exception ex){}
  48.                
  49.                 }
  50.         }
  51.         public void actionPerformed(ActionEvent e) {
  52.                 if (e.getSource()==btStart) {
  53.                         // Put your code here
  54.                         if (clockThread == null){
  55.                                 clockThread = new Thread(this);
  56.                                 clockThread.start();
  57.                         }

  58.                 }
  59.                 if (e.getSource()==btStop) {
  60.                         stop();
  61.                 }
  62.                 if (e.getSource()==btReset) {
  63.                         reset();
  64.                 }
  65.                
  66.         }
  67.         private void timeTick() {
  68.         second = (second + 1) % 60;
  69.         if (second == 0)
  70.                 minute = (minute + 1) % 60;
  71.         }
  72.         private void reset() {
  73.                 second = 0;
  74.                 minute = 0;
  75.                 tfMinute.setText("0");
  76.                 tfSecond.setText("0");
  77.         }
  78. }
複製代碼
我想問的是
如果 你 好快咁係 start 同 stop 的 button 輪流咁 click 的話
最後click 的要係 start 的 button, (e.g.  start -> stop -> start-> .......... -> start)

個 秒數個 text box 個 數會 飛得好快,
其實會唔會係  stop 用 " clockThread = null; " 唔係 咁好呢 ???
定係會係 咩問題呢 ?

[ 本帖最後由 konomama 於 2009-2-3 23:58 編輯 ]

原帖由 konomama 於 2009-2-3 23:56 發表
/**/


import javax.swing.*;
import java.awt.*;
import java.applet.*;
import java.awt.event.*;


public class StopWatchApplet extends Applet implements Runnable, ActionListener {
        private TextField tf ...


你唔stop 條thread 就null...

TOP

原帖由 thinkpanda 於 2009-2-4 00:46 發表


你唔stop 條thread 就null...

你指 thread.stop() ????
但 java.sun.com 唔係話 stop()  Deprecated 咩 ??
所以 我做唔知 重有無其他方法 可以做到 咁ge 效果

[ 本帖最後由 konomama 於 2009-2-4 01:33 編輯 ]

TOP

thread synchronization 問題...
因為你 check null  跳出 run 個 while loop.
假如有一條 thread A loop 緊, sleep 1s ..
你 stop, 好快 1s 內再 start 另一條 thread B ...
thread A sleep 完 check 到 clockThread != null .. 又繼續.. Thread B 亦繼續 ... 如是者有好多條 thread 一齊行, 咁咪跳得好快 lor.  

TOP

原帖由 konomama 於 2009-2-4 01:21 發表

你指 thread.stop() ????
但 java.sun.com 唔係話 stop()  Deprecated 咩 ??
所以 我做唔知 重有無其他方法 可以做到 咁ge 效果


你可以係個thread 入面set 個flag, 使得run() 入面既loop 見到個flag set 左就自行死亡.

TOP