深 圳 大 学 实 验 报 告
课程名称: Java程序设计
实验项目名称: 线程
学院: 计算机与软件学院
专业:
指导教师: ***
报告人: 学号: 班级: 3班
实验时间: 2012年12月13日
实验报告提交时间: 2012年12月26日
教务部制
一、实验内容:
8.2.3 吵醒休眠的线程
实验代码:
class Shop implements Runnable {
Thread zhangWorker,wangWorker,boss; Shop() {
boss=new Thread(this);//创建boss,Shop对象为boss目标对象 zhangWorker=new Thread(this); wangWorker=new Thread(this); zhangWorker.setName(\"张工\"); wangWorker.setName(\"王工\"); boss.setName(\"老板\"); }
public void run() {
int i=0;
if(Thread.currentThread()==zhangWorker) {
while(true) {
try {i++;
System.out.printf(\"\\n%s已搬运了%d箱苹果\\n\",zhangWorker.getName(),i); if(i==3)return;
Thread.sleep(10000); }//zhangWorker休眠10秒}
catch(InterruptedException e){System.out.printf(\"\\n%s让%s继续工作\",boss.getName(),zhangWorker.getName());} } }
else if(Thread.currentThread()==wangWorker) {
while(true) {
try
{
i++;
System.out.printf(\"\\n%s已搬运了%d箱香蕉\\n\",wangWorker.getName(),i); if(i==3) return;
Thread.sleep(10000); }
catch(InterruptedException e){System.out.printf(\"\\n%s让%s继续工作\",boss.getName(),wangWorker.getName());} } }
else if(Thread.currentThread()==boss) {
while(true) {
zhangWorker.interrupt();//吵醒zhangWorker wangWorker.interrupt();
if(!(wangWorker.isAlive()||zhangWorker.isAlive())) {
System.out.printf(\"%n%s下班\",boss.getName()); return; } } } } }
public class ShopExample {
public static void main(String args[]) {
Shop shop=new Shop();
shop.zhangWorker.start(); shop.wangWorker.start(); shop.boss.start(); } }
实验截图:
8.2.4 排队买票
实验代码:
class TicketSeller//负责卖票的类 {
int fiveNumber=1,tenNumber=0,twentyNumber=0;
public synchronized void sellTicket(int receiveMoney,int buyNumber) {
if(receiveMoney==5) {
fiveNumber=fiveNumber+1;
System.out.printf(\"\\n%s给我5元钱,这是您的1张入场券\",Thread.currentThread().getName()); }
else if(receiveMoney==10&&buyNumber==2) {
tenNumber=tenNumber+1;
System.out.printf(\"\\n%s给我10元钱,这是您的2张入场券\",Thread.currentThread().getName()); }
else if(receiveMoney==10&&buyNumber==1) {
while(fiveNumber<1)//给出线程等待的条件 {
try {
System.out.printf(\"\\n%s靠边等\",Thread.currentThread().getName()); wait();//线程进入等待状态
System.out.printf(\"\\n%30s结束等待状态\\n\",Thread.currentThread().getName()); }
catch(InterruptedException e){} }
fiveNumber=fiveNumber-1; tenNumber=tenNumber+1;
System.out.printf(\"\\n%s给我10元钱,找您5元钱,这是您的1张入场券\",Thread.currentThread().getName()); }
else if(receiveMoney==20&&buyNumber==1) {
while(fiveNumber<1||tenNumber<1)//给出线程需要等待的条件 {
try {
System.out.printf(\"\\n%30s靠边等\",Thread.currentThread().getName()); wait();//线程进入等待状态
System.out.printf(\"\\n%30s结束等待\",Thread.currentThread().getName()); }
catch(InterruptedException e){} }
fiveNumber=fiveNumber-1; tenNumber=tenNumber-1;
twentyNumber=twentyNumber+1;
System.out.printf(\"\\n%s给我20元钱,找您一张5元和一张10元,
这是您的1张入场券\",Thread.currentThread().getName()); }
else if(receiveMoney==20&&buyNumber==2) {
while(tenNumber<1)//给出线程等待的条件 {
try {
System.out.printf(\"\\n%30s靠边等\\n\",Thread.currentThread().getName()); wait();//线程进入的等待状态
System.out.printf(\"\\n%30s结束等待\",Thread.currentThread().getName()); }
catch(InterruptedException e){} }
tenNumber=tenNumber-1;
twentyNumber=twentyNumber+1;
System.out.printf(\"\\n%s给我20元钱,找您一张10元,这是您的2张入场券\",Thread.currentThread().getName()); }
notifyAll();//通知等待的线程结束等待 } }
class Cinema implements Runnable {
Thread zhao,qian,sun,li,zhou; TicketSeller seller; Cinema() {
zhao=new Thread(this); qian=new Thread(this); sun=new Thread(this); li=new Thread(this); zhou=new Thread(this); zhao.setName(\"赵\"); qian.setName(\"钱\"); sun.setName(\"孙\"); li.setName(\"李\"); zhou.setName(\"周\");
seller=new TicketSeller(); }
public void run() {
if(Thread.currentThread()==zhao) seller.sellTicket(20,2);
else if(Thread.currentThread()==qian) seller.sellTicket(20,1);
else if(Thread.currentThread()==sun) seller.sellTicket(10,1);
else if(Thread.currentThread()==li) seller.sellTicket(10,2);
else if(Thread.currentThread()==zhou) seller.sellTicket(5,1); } }
public class SaleExample {
public static void main(String args[]) {
Cinema cinema=new Cinema(); cinema.zhao.start(); try {
Thread.sleep(1000); }
catch(InterruptedException e){} cinema.qian.start(); try {
Thread.sleep(1000); }
catch(InterruptedException e){} cinema.sun.start(); try {
Thread.sleep(1000); }
catch(InterruptedException e){} cinema.li.start(); try {
Thread.sleep(1000); }
catch(InterruptedException e){}
cinema.zhou.start(); } }
实验截图:
二、实验体会:
对于实验“吵醒睡眠的线程”,让我更熟悉了interrupt()方法的使用,interrupt()方法常用来“吵醒”休眠的线程。当一些线程调用了sleep()方法处于休眠状态时,一个只用CPU资源的其他线程在执行的过程中,可以让休眠的线程分别调用interrupt()方法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源。
打完代码后,反复运行程序,发现每次程序运行后输出的结果都不一样,可能是运行过程中间断的时间比较短,间隔时间稍长一点,结果就不会变的这么频繁了。
对于实验“排队买票”,更多的使用了wait()、notify()和notifyAll()方法。对3个方法的解释:一个线程使用的同步方法中用到某个变量,而此变量又需要其他线程修改后才能符合本线程的需要时,可以在同步方法中使用wait()方法,其可以中断方法的执行,是本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。用notifyAll()通知所有的由于使用同步方法而处于等待的线程结束等待。曾中断的线程就会重新排队等待CPU资源,以便从刚才的中断处执行这个同步方法,也可以用notify()方法通知处于等待线程中的某一个结束等待。
因篇幅问题不能全部显示,请点此查看更多更全内容