实验6-多线程_第1页
实验6-多线程_第2页
实验6-多线程_第3页
实验6-多线程_第4页
实验6-多线程_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上实验6 多线程一、实验名称和性质所属课程Java语言程序设计实验名称多线程设计实验学时4实验性质验证 综合设计必做/选做必做 选做二、实验目的1. 理解线程概念;了解线程的状态和生命周期;2. 学习继承Thread类来创建线程;3. 理解线程互斥与同步的含义;掌握Synchrnized同步方法。三、实验内容1设计一个包含多线程运行的程序,在主程序中依次创建3个线程,然后按顺序启动这3个线程,每个线程在执行时都是先睡眠(sleep)一会儿,醒来之后再继续执行(验证性实验)。2用程序模拟铁路火车票售票系统,实现通过3个售票窗口同时发售某次列车的100张车票。程序中会有3个

2、线程同时对同一个车票对象进行操作,每个线程的操作都按相同的步骤进行,即将当前车票数加1,然后将当前车票数与剩余车票数显示出来。由于车票数是临界资源,一次只能有一个线程完成读写操作,因此必须处理好线程之间的互斥关系(设计性实验)。四、实验的软硬件环境要求硬件环境要求:PC计算机;内存512MB以上使用的软件名称、版本号以及模块:操作系统:Windows 2000或Windows XP软件:JDK7.0;Ecliplse五、知识准备前期要求掌握的知识:了解Java程序的运行流程。实验相关理论或原理:多线程是指一个程序中可以包含两个或两个以上同时并发运行的程序单元,每个程序单元称之为一个线程。Jav

3、a为多线程编程提供了语言级的支持,因此可以编写高效率的程序。一个线程从它被创建到运行结束的过程,称为线程的生命周期。在Java中使用多线程有如下两种方式:一是继承Thread线程类,第二是实现Runnable接口。在Thread类中有两个主要的方法,一个是run()方法,另一个是start()方法,在Thread类的派生类中要覆盖这个run()方法,将多线程代码放入其中。Start()方法的作用是启动一个线程,它会自动地去调用run()方法以执行该线程。 为了使多个线程互斥地使用临界资源,可以在临界资源上使用synchrnized修饰符。六、验证性实验 1实验要求编译、运行ThreeThrea

4、ds.java程序,运行结果如图7.1所示。图7.1 验证性实验运行结果 2源程序代码参考class MyThread extends Thread public MyThread(String name) super(name); public void run() /让线程进入休眠状态,休眠指定的时间 int sleeptime=100; try System.out.println(getName() + " 将休眠" + sleeptime + "毫秒"); Thread.sleep(sleeptime) ; /休眠 catch (Interru

5、ptedException ex) ex.printStackTrace(); System.out.println(getName() + " 结束休眠"); public class ThreeThreads public static void main(String args) MyThread thread1 = new MyThread("线程1"); MyThread thread2 = new MyThread("线程2"); MyThread thread3 = new MyThread("线程3"

6、;); thread1.start(); thread2.start(); thread3.start(); 运行结果:线程2 将休眠100毫秒线程1 将休眠100毫秒线程3 将休眠100毫秒线程3 结束休眠线程1 结束休眠线程2 结束休眠七、设计性实验1 编译、运行程序TestSaleTicket.java ,结果如图7.2所示。图7.2 设计性实验运行结果class Ticket /车票类 int curticket; /当前票数 int ticketCount; /总票数 public Ticket(int curticket, int ticketCount) this.curtick

7、et = curticket; this.ticketCount = ticketCount; class SaleTicket implements Runnable /售票类 private Ticket t;public SaleTicket(Ticket t)this.t = t;public void run()while(true)synchronized(this)if(t.curticket < t.ticketCount)tryThread.sleep(50);catch(InterruptedException ex) t.curticket+;System.out.

8、println(Thread.currentThread().getName() + "正在销售第" + t.curticket + "张票,剩余票数:" + (t.ticketCount - t.curticket); elsebreak; public class TestSaleTicket /测试类 public static void main(String args) Ticket t = new Ticket(0, 100); SaleTicket st = new SaleTicket(t); Thread win1 = new Thre

9、ad(st, "售票窗口1"); Thread win2 = new Thread(st, "售票窗口2"); /实例化线程对象窗口1 Thread win3 = new Thread(st, "售票窗口3"); /实例化线程对象窗口2 win1.start(); win2.start(); win3.start(); 运行结果:2. 编写程序,启动1000个线程。每个线程给初始值为0的变量total加1。通过引用传递的方式将total传递给每个线程。使用同步和不同步来运行这个程序,看看他们的效果。 提示:为了能够进行引用传递,需要定

10、义包装对象来保存total变量。代码:同步:package experimentSix;public class TestThread1 private static Account account = new Account();class Add implements Runnablepublic void run()account.add();private static class Accountpublic static int total = 0;public int getTotal()return total;public synchronized void add()tryT

11、hread.sleep(5);catch(InterruptedException ex)total+;System.out.println(account.getTotal();public static void main(String args)for(int i = 0 ; i < 1000 ; i+)new Thread(new TestThread1().new Add().start();运行结果: 不同步:package experimentSix;public class TestThread public static int total = 0;class Add implements Runnablepublic void run()total+;System.out.println(total);public static void main(String args)for(int i = 0 ; i < 1000 ; i+)new Thread(new TestThread().new Add().start()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论