问题 问答题

下面是一个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做累加。

单项选择题 A1/A2型题
单项选择题