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

admin2009-01-15  37

问题 下面是一个Applet程序,其功能是实现一个计数器,每隔0.15秒计数器数值加1,数值动态变化,并且能够控制计数器的暂停和继续。要求通过使用swing的构件建立图形用户界面,主要包括一个文本区域,用于显示计数器结果;两个按钮,一个使计数器暂停,一个使计数器继续工作。请改正程序中的错误(有下划线的语句),使程序能输出正确的结果。注意:不改动程序的结构,不得增行或删行。
   import javax, swing. *
   import java. awt. *
   import java. awt. event. *
   /*
   <applet code= "ex4_2. class" width=800 height=400>
   </applet>
   */
   public class ex4_2 extends JApplet {
     private JTextField jtf=new JTextField(15);
     private JButton Hold = new JButton ("Hold"), resume = new JButton ( "Resume" );
     private ex4_2th obj4_2th= new ex4_2th();
     class ex4_2th extends Thread {
       private int cnt=0;
       private boolean bIsHold=false;
       public ex4_2th() {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)
                 notify( );
             }
           } 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) {
           obj4_2th. hold()
         }
         });
     cp. add(Hold);
     resume, addActionListener (
       new ActionListener() {
         public void actionPerformed(ActionEvent e)
           obj4_2th. fauxResume( )
         }
         });
       cp. add(resume)
   }
   public static void main(String[] args) {
         ex4_2 obj4_2 =new ex4_2()
     String str= obj4_2. 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(0);
           }
           });
       frm. getContentPane(), add(obj4_2)
       frm. setSize(300,200)
       obj4_2. init()
       obj4_2. start( );
       frm. setVisible(true)
     }
   }
   ex4_2. html
   <HTML>
     <HEAD>
       <TITLE>ex4_2</TITLE>
     </HEAD>
     <BODY>
     <applet code="ex4_2. 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/LSb0FFFM
0

相关试题推荐
最新回复(0)