ImageVerifierCode 换一换
格式:DOCX , 页数:34 ,大小:101.64KB ,
资源ID:4160072      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4160072.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Java语言程序设计试题及答案5.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Java语言程序设计试题及答案5.docx

1、Java语言程序设计试题及答案5Java语言程序设计试题及答案第八章 多线程8.1建立线程有哪两种方法? 答:一是继承Thread类声明Thread子类,用Thread子类创建线程对象。二是在类中实现Runnable接口,在类中提供Runnable接口的run()方法。无论用哪种方法,都需要java基础类库中的Thread类及其方法的支持。程序员能控制的关键性工作有两个方面:一是编写线程的run()方法;二是建立线程实例。 8.2怎样设置线程的优先级? 答:setPriority(int p),设定线程的优先级为p(110)。线程创建时,子线程继承父线程的优先级。 优先级的数值越大优先级越高(

2、缺省为)。常用以下个优先级: Thread.MIN_PRIORITY(最低)Thread.MAX_PRIORITY(最高)Thread.NORMAL_PRIORITY(标准)8.3编写程序,一个画圆,一个画椭圆。程序运行结果:Applet的源文件:Work8_3.javaimport java.applet.Applet;import java.awt.Color;import java.awt.Graphics;/* * 8.3 用一个红色笔画圆,同时用一个蓝色笔画椭圆 */public class Work8_3 extends Applet implements Runnable pri

3、vate static final long serialVersionUID = 1L; /* 两个线程,红笔线程,和蓝笔线程 */ private Thread red_thread, blue_thread; /* 红色画笔、蓝色画笔 */ private Graphics redPen, bluePen; /* 蓝、红笔画时需要旋转角度 */ private int blue_angle = 0, red_angle = 0; /* 红色画的图案的中心坐标 */ private int a_red = 100, b_red = 100; /* 蓝色画的图案的中心坐标 */ privat

4、e int a_blue = 300, b_blue = 100; /*圆形半径*/ private int radius_red = 80; /*椭圆的两个半径*/ private int radius1_blue = 150, radius2_blue = 100; public void init() red_thread = new Thread(this); blue_thread = new Thread(this); redPen = getGraphics(); bluePen = getGraphics(); setBackground(Color.white); setSi

5、ze(470, 240); public void start() red_thread.start();/ 两个线程开始 blue_thread.start(); public void run() while (true) if (Thread.currentThread() = red_thread) redPen.drawOval(25, 25, 160, 160);/ 绘制圆的边框。x,y,width,height int x = getX(radius_red, red_angle, a_red); int y = getY(radius_red, red_angle, b_red

6、); redPen.setColor(Color.WHITE); redPen.fillOval(x, y, 10, 10);/ 用白色画一次,可以擦出痕迹 red_angle += 3; if (red_angle = 360) red_angle = 0; x = getX(80, red_angle, 100); y = getY(80, red_angle, 100); redPen.setColor(Color.RED); redPen.fillOval(x, y, 10, 10);/ 使用当前颜色填充外接指定矩形框的椭圆 try Thread.sleep(10); catch( I

7、nterruptedException e ) else if (Thread.currentThread() = blue_thread) bluePen.drawOval(a_blue / 2 + 5, b_blue / 2 - 45, radius1_blue * 2, radius2_blue * 2);/ 绘制椭圆的边框。x,y,width,height int x = getX(radius1_blue, blue_angle, a_blue); int y = getY(radius2_blue, blue_angle, b_blue); bluePen.setColor(Col

8、or.WHITE); bluePen.fillOval(x, y, 10, 10);/ 擦除痕迹 blue_angle += 3; if (blue_angle = 360) blue_angle = 0; x = getX(radius1_blue, blue_angle, 300); y = getY(radius2_blue, blue_angle, 100); bluePen.setColor(Color.BLUE); bluePen.fillOval(x, y, 10, 10);/ 擦除痕迹 try Thread.sleep(20); catch( InterruptedExcept

9、ion e ) /* * 用参数方程方法,计算坐标的方法 * param r 圆的半径,椭圆的两个半轴 * param loc x坐标的相对偏移量 * param angle 旋转的角度,单位为角度 * return 计算后的坐标值 */ public int getX(int r, int angle, int locX) int x = locX + (int) (r * Math.cos(Math.PI / 180.0 * angle); return x; /* * 用参数方程方法,计算坐标的方法 * param r 圆的半径,椭圆的两个半轴 * param loc Y坐标的相对偏移量

10、 * param angle 旋转的角度,单位为角度 * return 计算后的坐标值 */ public int getY(int r, int angle, int locY) int y = locY + (int) (r * Math.sin(Math.PI / 180.0 * angle); return y; 8.4在多线程程序中,要考虑互斥的原因是什么?在Java中如何解决?答:多线程之间要共享资源,为了保护资源在使用时,不被其他线程使用。在Java语言中,使用关键字synchronized定义临界段,能对共享对象的操作上锁。8.5在多线程程序中,要考虑同步的原因是什么?在Jav

11、a中如何解决?答:在临界段中使用wait()方法,使执行该方法的线程等待,并允许其他线程使用这个临界段。wait()方法常用以下两种格式:wait(),让线程一直等待,直到被notify()或notifyAll()方法唤醒。wait(long timeout),让线程等待到被唤醒,或经过指定时间后结束等待。当线程使用完临界段后,用notify()方法通知由于想使用这个临界段而处于等待的线程结束等待。notify()方法只是通知第一个处于等待的线程。如果某个线程在使用完临界段方法后,其他早先等待的线程都可结束等待,重新竞争CPU,则可以notifyAll()方法。8.6模拟排队买票,球票5元,购

12、票者持有5,10,20,50元的,售票员手里开始没有零钱。程序运行结果:主窗体源文件:BuyTicketFrame.javaimport java.awt.*;import java.awt.event.*;import javax.swing.*;/* * 8.6 线程实现,购票规则,由于我想的算法太过复杂,只写到50元面值的 * author 段智敏 */public class BuyTicketFrame extends JFrame implements ActionListener, Runnable private static final long serialVersionU

13、ID = 1L; private Conductor lady; private int array = 10, 10, 5, 20, 50, 5, 5, 5, 5, 5, 5, 10, 20, 10, 5, 10, 20, 5 ; private int number = array.length; private Thread thread = new Threadnumber; static JTextArea text; private JButton begin_button, replay_button; private JPanel panel; public BuyTicket

14、Frame() super(第八章,第六题,线程模拟购票); lady = new Conductor(15); text = new JTextArea(); panel = new JPanel(); begin_button = new JButton(开始买票); replay_button = new JButton(重新开始); for (int i = 0; i array.length; i+) threadi = new Thread(this); begin_button.addActionListener(this); replay_button.addActionLis

15、tener(this); panel.setLayout(new FlowLayout(); panel.add(begin_button); panel.add(replay_button); this.add(panel, BorderLayout.NORTH); this.add(new JScrollPane(text), BorderLayout.CENTER); this.setSize(1000, 700); this.setVisible(true); this.validate(); this.addWindowListener(new WindowAdapter()/ 窗口

16、监视器 public void windowClosing(WindowEvent e) System.exit(0); ); public void actionPerformed(ActionEvent e) if (e.getSource() = begin_button)/ 线程开始 text.setText(* + number + 个人排队买票,共 + lady.getTicketAmount() + 张票,开始卖票:n); try for (int i = 0; i array.length; i+) threadi.start(); if (threadi.isAlive()

17、text.append( + (i + 1) + 线程开始n); begin_button.setForeground(Color.RED); catch( IllegalThreadStateException ee ) text.append(error:重复启动线程 + ee.toString(); / 检查线程是否结束 while (true) int n = 0; for (int i = 0; i array.length; i+) if (threadi.isAlive() break; else n+; if (n = array.length) break; begin_bu

18、tton.setForeground(Color.BLUE);/ 全部线程结束 text.append(n全部线程结束,已经没有排队等待买票的了); if (e.getSource() = replay_button) this.removeAll(); new BuyTicketFrame(); public void run() for (int i = 0; i array.length; i+) if (Thread.currentThread() = threadi) lady.rule(i + 1, arrayi); public static void main(String a

19、rgs) new BuyTicketFrame(); 售票员类源文件:Conductor.java/* * 售票员 * author 段智敏 */class Conductor /* 售票员开始持有的各种钞票的数量 */ private int five = 0, ten = 0, twenty = 0, fifty = 0; /* 总的票数 */ private int ticket_amount; /* * 构造方法 * param number - 票的初始数 */ public Conductor(int number) this.ticket_amount = number; pub

20、lic int getTicketAmount() return ticket_amount; /* * 买票规则方法 */public synchronized void rule(int index, int money) if (ticket_amount = 0) BuyTicketFrame.text.append(index + *售票结束*n); return; if (money = 5) fiveGive(index); if (money = 10) tenGive(index); if (money = 20) twentyGive(index); if (money =

21、 50) fiftyGive(index); BuyTicketFrame.text .append(-); BuyTicketFrame.text.append(剩余票数: + ticket_amount + 张:¥:5元: + five + 张;10元: + ten + 张;20元: + twenty + 张;50元: + fifty + 张n); notifyAll();/ 唤醒所以线程 public void fiveGive(int index) if (ticket_amount = 1) break; else BuyTicketFrame.text.append(第 + ind

22、ex + 个,10元,找不开,发.生.等.待.n); try wait(); catch( InterruptedException e ) if (ticket_amount = 1 & ten = 1) | five = 3)/ 20元的两种找钱规则:3*5,10+5 break;/ 跳出while循环,意味着有符合的规则 else BuyTicketFrame.text.append(第 + index + 个,20元,找不开,发.生.等.待.n); try wait(); catch( InterruptedException e ) if (ticket_amount = 1 & f

23、ive = 1)/ 20元找钱规则:10+5 ticket_amount-; five-; ten-; twenty+; BuyTicketFrame.text.append(第 + index + 个,20元的,找你1个5元,1个10块的,给你票n); return; else if (five = 3)/ 20元找钱规则:5*3 ticket_amount-; five -= 3; twenty+; BuyTicketFrame.text.append(第 + index + 个,20元的,找你3个5元的,给你票n); public void fiftyGive(int index)/ 5

24、0元,找钱规则 while (true) if (twenty = 2 & five = 1) | (twenty = 1 & ten = 2 & five = 1) | (twenty = 1 & ten = 1 & five = 3) | (ten = 4 & five = 1) | (ten = 3 & five = 3) | (ten = 2 & five = 5) | (ten = 1 & five = 7) | (five = 9) break;/ 50元的8种找钱方法 else BuyTicketFrame.text.append(第 + index + 个,50元,找不开,发.生.等.待.n); try wait(); catch( InterruptedException e ) / 跳出while循环后,符合照片规则 if (ticket_amount = 0) BuyTicketFrame.text.append(index + *售票结束*n); return; / 先可20的先找,然后在10元的

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1