刚学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){}
}
计时器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){}
}
---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,那没关系 有检查的!
// If the Timer is already in the queue, then ignore the add.
if (timer.running) {
return;
}