问题 问答题

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

import javax.swing.*;import java.awt.*; import java.awt.event.*;/**/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) 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) { 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 = obj7_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(0); } }); frm.getContentPane().add(obj7_3);frm.setSize(300, 200);obj7_3.init();obj7_3.start();frm.setVisible(true); }}ex7_3.html ex7_3

答案

参考答案: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做累加。

单项选择题
单项选择题 B1型题