下面Applet程序,其功能是实现一个计数器,每隔0.15秒计数器数值加1,数值动态变化,并且能够控制计数器的暂停和继续。要求通过使用swing的构件建立图形用户界面,主要包括一个文本区域,用于显示计数器结果;两个按钮,一个使计数器暂停,一个使计数器继续工

admin2009-01-15  99

问题 下面Applet程序,其功能是实现一个计数器,每隔0.15秒计数器数值加1,数值动态变化,并且能够控制计数器的暂停和继续。要求通过使用swing的构件建立图形用户界面,主要包括一个文本区域,用于显示计数器结果;两个按钮,一个使计数器暂停,一个使计数器继续工作。请改正程序中的错误(有下划线的语句),使程序能输出正确的结果。
   注意:不改动程序的结构,不得增行或删行。
   程序运行结果如下:

      import javax.swing.*;
      import java.awt.*;
      import java.awt.event.*;
      /*
      <applet code="ex7_3.class" width=800 height=400 >
      </applet>
      */
      public class ex7_3 extends JApplet {
          private JTextField jtf = new JTextField(15);
          private JButton Hold = new JButton("Hold"),resume = new JButton("Resume");
          private ex7_3th obj7_3th = new ex7_3th();
          class ex7_3th extends Thread {
            private int cnt = 0;
            private boolean bIsHold = false;
            public ex7_3th()  { start();  }
            public void hold()  {
               bIsHold = true;
            }
            public synchronized void fauxResume()  {
               bIsHold = false;
               wait();
              }
              public void run()  {
                 while  (true)  {
                     try {
                        sleep(150);
                        synchronized(this)  {
                           while (bIsHold)
                             not i fy ( );
                         }
                       } catch(InterruptedException ie)  {
           System.err.println("Interrupted");
       }
          jtf.setText(cnt);
     }
   }
   public void init()  {
   Container cp = getContentPane();
   cp.setLayout(new FlowLayout());
   cp.add(jtf);
   Hold.addActionListener(
     new ActionListener()  {
       public void actionPerformed(ActionEvent ae) {
         obj7_3th.hold();
      }
      });
   cp.add(Hold);
   resume.addActionListener(
     new ActionListener()  {
       public void actionPerformed(ActionEvent e){
          obj7_3th.fauxResume();
     }
    });
   cp.add(resume);
   public static void main(String[]  args)  {
      ex7_3 obj7_3=new ex7_3();
   String str= obi7_3.getClass().toString();
      if(str.indexOf("class")  != -1)
        str= str.substring(6);
      JFrame frm = new JFrame(str);
      frm.addWindowListener(new WindowAdapter()  {
         public void windowClosing(WindowEvent we) {
           System.exit(O);
         }
      });
     frm.getContentPane().add(obj7_3);
     frm.setSize(300,  200);
     obj7_3.init();
     obi7_3.start();
     frm.setVisible(true);
    }
   }
    ex7_3.html
   <HTML>
   <HEAD>
     <TITLE>ex7_3</TITLE>
   </HEAD>
   <BODY>
   <applet code="ex7_3.class"width=800 height=400>
   </applet>
   </BODY>
    </HTML>

选项

答案notify() wait() jtf.setText(Integer.toString(cnt++))

解析 本题主要考查图形用户界面,swing以及线程同步、共享、死锁相结合的综合应用。解题关键是熟悉wait()方法和notify()方法的含义,wait()必须被声明为synchronized,这样它才能拥有对象锁。fauxResume()把bIsHold标志设为false,并调用notify(),为了唤醒synchronized子句中的wait(),所以notify()也必须被声明为synchronized,这样才能在调用notify()之前获得对象锁 (然后该对象锁才能在wait()执行时被运用)。本题中,第一和第二处,应该在bIsHold为true时调用wait(),而在fauxResume()中调用notify();第三处,需要对int类型作转换才能够作为String类型输出,并且要对计数器变量cnt做累加。
转载请注明原文地址:https://jikaoti.com/ti/nkkiFFFM
0

最新回复(0)