Practice Every Day_2

来源:互联网 发布:mac语言设置 编辑:程序博客网 时间:2024/06/03 19:38

            看看我改进之后的计时器,以下是代码:

 

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Counter extends Applet
{
   private class SeparateSubTask extends Thread
   {
    int count=0;
    boolean runFlag=true;
    SeparateSubTask()
    {
   start(); 
    }
    public void run()
    {
   while(true)
   {
    try{
     Thread.sleep(1000);
          }
    catch(InterruptedException e){}
    if(runFlag)
     t.setText(Integer.toString(count++));
   }         
    }
}
 private  SeparateSubTask sp=null;
 private TextField t=new TextField(10);
 private Button onOff=new Button("关闭"),
                start=new Button("开始");
 public void init()
 {
   add(t);
   start.addActionListener(new StartL());
   add(start);
   onOff.addActionListener(new OnOffL());
   add(onOff);
 }
  class StartL implements ActionListener
  {
   public void actionPerformed(ActionEvent e)
   {
    if (sp==null);
    sp=new SeparateSubTask();
   }        
  }
 class OnOffL implements ActionListener
 {
  public void actionPerformed(ActionEvent e)
  {
   if(sp!=null)
    sp.runFlag=!sp.runFlag;
  }    
 } 
 
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
   Counter applet=new Counter();
   Frame MyFrame=new Frame("线程与窗口的结合");
   MyFrame.addWindowListener(new WindowAdapter()
   {
    public void windowClosing(WindowEvent e)
     {
    System.exit(0);
     }
   });   
   MyFrame.add(applet,BorderLayout.CENTER);
   MyFrame.setSize(300,200);
   applet.init();
   applet.start();
   MyFrame.setVisible(true);
 }

}

效果图:

现在计时器可以从一开始计时,并且暂停之后,再次开始时是从暂停的地方开始的。

下面是创建多个这样的计时器的代码:

 

 

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
class Ticker extends Thread
{
 private Button b=new Button("暂停"); 
 private TextField t=new TextField(10);
 private int count=0;
 private Boolean runFlag=true;
 public Ticker(Container c)
 {
  Panel p=new Panel();
  b.addActionListener(new ToggleL());
  p.add(b);
  p.add(t);
     c.add(p);
 }
class ToggleL implements ActionListener
{
  public void actionPerformed(ActionEvent e)
  {
     runFlag=!runFlag; 
  }
}
public void run()
{
 while(true) 
 {
 if(runFlag)t.setText(Integer.toString(count++));
  try{sleep(1000);}
  catch(InterruptedException e){} 
 }
}
}
public class Counter1 extends Applet
{
 private Button start=new Button("开始");
 private boolean started=false;
    private Ticker[]s;
    private boolean isApplet=true;
    private int size;
    public void init()
    {
     if(isApplet)size=5;
       //Integer.parseInt(getParameter("size"));
     s=new Ticker[size];
     for(int i=0;i<s.length;i++)
      s[i]=new Ticker(this);
     start.addActionListener(new StartL());
     add(start);
    }
    class StartL implements ActionListener
    {
      public void actionPerformed(ActionEvent e)  
      {
     if(!started){
                   started=true;
                   for(int i=0;i<s.length;i++)
                     s[i].start();
                 } 
      }

   }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
         Counter1 applet=new Counter1();
         applet.isApplet=false;
         applet.size=(args.length==0?5:Integer.parseInt(args[0]));
         Frame MyFrame=new Frame("Counter1");
         MyFrame.addWindowListener(new WindowAdapter()
                 { public void WindowClosing(WindowEvent e)
             {
                    System.exit(0);
             }
                 } );
         MyFrame.add(applet,BorderLayout.CENTER);
         MyFrame.setSize(200,applet.size*50);
         applet.init();
         applet.start();
         MyFrame.setVisible(true);
 }
}

效果图如下:

但是同样存在问题,那就是点击开始按钮之后,所有线程都开始了。如下图所示:

不过,暂停按钮可以控制所对应的线程的休息。如下图所示:

原创粉丝点击