JAVA多线程的实验报告 下载本文

深 圳 大 学 实 验 报 告

课程名称: 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(\已搬运了%d箱苹果\\n\,zhangWorker.getName(),i); if(i==3)return;

Thread.sleep(10000); }//zhangWorker休眠10秒}

catch(InterruptedException e){System.out.printf(\让%s继续工作\,boss.getName(),zhangWorker.getName());} } }

else if(Thread.currentThread()==wangWorker) {

while(true) {

try

{

i++;

System.out.printf(\已搬运了%d箱香蕉\\n\,wangWorker.getName(),i); if(i==3) return;

Thread.sleep(10000); }

catch(InterruptedException e){System.out.printf(\让%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(\下班\,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(\给我5元钱,这是您的1张入场券\,Thread.currentThread().getName()); }

else if(receiveMoney==10&&buyNumber==2) {

tenNumber=tenNumber+1;

System.out.printf(\给我10元钱,这是您的2张入场券\,Thread.currentThread().getName()); }

else if(receiveMoney==10&&buyNumber==1) {

while(fiveNumber<1)//给出线程等待的条件 {

try {

System.out.printf(\靠边等\,Thread.currentThread().getName()); wait();//线程进入等待状态

System.out.printf(\结束等待状态\\n\,Thread.currentThread().getName()); }

catch(InterruptedException e){} }

fiveNumber=fiveNumber-1; tenNumber=tenNumber+1;

System.out.printf(\给我10元钱,找您5元钱,这是您的1张入场券\,Thread.currentThread().getName()); }

else if(receiveMoney==20&&buyNumber==1) {

while(fiveNumber<1||tenNumber<1)//给出线程需要等待的条件 {

try {

System.out.printf(\靠边等\,Thread.currentThread().getName()); wait();//线程进入等待状态

System.out.printf(\结束等待\,Thread.currentThread().getName()); }

catch(InterruptedException e){} }

fiveNumber=fiveNumber-1; tenNumber=tenNumber-1;

twentyNumber=twentyNumber+1;

System.out.printf(\给我20元钱,找您一张5元和一张10元,

这是您的1张入场券\,Thread.currentThread().getName()); }

else if(receiveMoney==20&&buyNumber==2) {

while(tenNumber<1)//给出线程等待的条件 {

try {

System.out.printf(\靠边等\\n\,Thread.currentThread().getName()); wait();//线程进入的等待状态

System.out.printf(\结束等待\,Thread.currentThread().getName()); }

catch(InterruptedException e){} }

tenNumber=tenNumber-1;

twentyNumber=twentyNumber+1;

System.out.printf(\给我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()方法通知处于等待线程中的某一个结束等待。