刚学Java没多久,今天发现一个问题,一直想不明白,希望各位GGJJ可以给我点解释
计时器Timer使用start()启动计时器,即启动线程,使用stop()停止计时,那如果Timer的一个对象,启动线程后,线程没有死亡,又调用start(),为什么不会抛出异常?
就是下面这个类,让我产生的疑惑,每次单机鼠标都会调用了start()
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.applet.*;
public class HandleMove extends JPanel implements MouseListener,ActionListener {  
    Point [][] point;   
    File musicFile=new File("hello.wav");//
    URL url;//
    AudioClip clip;//
    int finishtime;//
    int grade;////////////
    Rank rank;
    int spendTime=0;
    javax.swing.Timer recordTime;
    JTextField showTime;
    RankNameDlg rankNameDlg;
    VerifySuccess verify;
    HandleMove(){
     finishtime=60*24*60;
     //构造音频播放对象为url
     try
     {
             url=musicFile.toURL();
             clip=Applet.newAudioClip(url);
     }
     catch(Exception e)
     {
     e.printStackTrace();
     }
        
        recordTime=new javax.swing.Timer(1000,this);
        showTime=new JTextField(16);
        showTime.setEditable(false);
        showTime.setHorizontalAlignment(JTextField.CENTER);
        showTime.setFont(new Font("楷体_GB2312",Font.BOLD,16));
        JLabel hitMess=new JLabel("用鼠标单击方块",JLabel.CENTER);
        hitMess.setFont(new Font("楷体_GB2312",Font.BOLD,18));      
        add(hitMess);
        add(showTime);
        setBackground(Color.cyan);
    } 
    public void setPoint(Point [][] p){
        point=p;
    }
    public void initSpendTime(){
        recordTime.stop();
        spendTime=0;
        showTime.setText(null);
    }
    public void createRank(int grade)///////////////////////////////////
    {
     this.grade=grade;
     //System.out.println(this.grade+"createrank");
     rank=new Rank(this.grade);
    }
     public void setRankNameDlg(RankNameDlg rankNameDlg)/////////////////////////////
     {
       this.rankNameDlg=rankNameDlg;
     }
    public void setVerifySuccess(VerifySuccess verify){
        this.verify=verify;
    }
    public void mousePressed(MouseEvent e){
        recordTime.start();
        //播放音乐
        clip.play();
   
        Block block=null;
        block=(Block)e.getSource();
        int w=block.getBounds().width;
        int h=block.getBounds().height;
        int startI=-1,startJ=-1,endI=-1,endJ=-1;
        Point startPoint=block.getAtPoint();
        Point endPoint=null;
        for(int i=0;i<point.length;i++){
           for(int j=0;j<point[0].length;j++)     
             if(point[i][j].equals(startPoint)){
                  startI=i;
                  startJ=j;
                  break; 
             }
        } 
        for(int i=0;i<point.length;i++){
           for(int j=0;j<point[0].length;j++)     
             if(point[i][j].isHaveBlock()==false){
                  endI=i;
                  endJ=j;
                  endPoint=point[i][j];
                  break; 
             }
        } 
        boolean moveCondition1=Math.abs(endI-startI)==1&&endJ==startJ;
        boolean moveCondition2=Math.abs(endJ-startJ)==1&&endI==startI; 
        if(moveCondition1||moveCondition2){
           block.setLocation(endPoint.getX(),endPoint.getY());
           block.setAtPoint(endPoint);  
           endPoint.setBlock(block);
           endPoint.setHaveBlock(true);
           startPoint.setHaveBlock(false);
        }        
    } 
    public void actionPerformed(ActionEvent e){
          spendTime++;
          showTime.setText("您的用时:"+spendTime+"秒");
    } 
    public void mouseReleased(MouseEvent e){
          if(verify.isSuccess()){
              recordTime.stop();
              finishtime=spendTime;
              //System.out.println(finishtime);
              //System.out.println(rank.ranktime[2]);
              if(finishtime<rank.ranktime[2])///////////////////
              {
                //System.out.println("跳出");
                 rankNameDlg.setVisible(true);
                String name=rankNameDlg.name;
                rank.resetrank(finishtime,name);
                rank.saverank();
              }/////////////////////////////////////////////////
             else
             {
               JOptionPane.showMessageDialog(this,"您成功了!","消息框",
                                     JOptionPane.INFORMATION_MESSAGE );
                                   }
            } 
            /*finishtime=23; 
            System.out.println(finishtime);/////////
            System.out.println(rank.ranktime[2]);/////////
            if(finishtime<rank.ranktime[2])///////////////////
              {
                System.out.println("跳出");
                 rankNameDlg.setVisible(true);
                String name=rankNameDlg.name;
                rank.resetrank(finishtime,name);
                rank.saverank();
               }*/
    }
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mouseClicked(MouseEvent e){}
}

解决方案 »

  1.   

    有时间多看看源代码:
    ---Timer
        /**
         * Starts the <code>Timer</code>,
         * causing it to start sending action events
         * to its listeners.
         *
         * @see #stop
         */
        public void start() {
            timerQueue().addTimer(this,
                                  System.currentTimeMillis() + getInitialDelay());
        }
    ---TimerQueue
        synchronized void addTimer(Timer timer, long expirationTime) {
            Timer previousTimer;
            Timer nextTimer;        // If the Timer is already in the queue, then ignore the add.
            if (timer.running) {
                return;
            }看看上面 TimerQueue是怎们说的? 不用担心你那么多次调用start,那没关系 有检查的!
      

  2.   

    恩,谢谢了!
    // If the Timer is already in the queue, then ignore the add.
      if (timer.running) {
      return;
      }