《多线程编程》由会员分享,可在线阅读,更多相关《多线程编程(9页珍藏版)》请在金锄头文库上搜索。
1、 南南昌昌大大学学实实验验报报告告学生姓名: 学 号: 专业班级: 实验类型: 验证 综合 设计 创新 实验日期:2012 年 5 月 24 日 实验成绩: 实验实验 1 使用使用 Thread 类创建类创建 4 线程程序线程程序1、实验目的实验目的1) 理解线程的概念; 2) 了解程序的状态和生命周期; 3) 学习继承 Thread 类来创建线程; 4) 使用 Runnable 接口。2、实验任务实验任务本实验是要设计一个包含多线程运行的程序,在主程序中依次创建 4 个线程, 然后按顺序启动 4 个线程,每个线程在运行时所动作都是先睡眠 sleep 一会儿, 醒来之后再继续执行,在这个过程中
2、注意观察线程是如何调度运行的。3、实验步骤实验步骤新建工程名字为 MultiThread,在工程中新建一个程序命名为 FourThreads.java 程序清单 131: /FourThreads.javapublic class FourThreadspublic static void main(String args)MyThread thread1=new MyThread(“thread1“);MyThread thread2=new MyThread(“thread2“);MyThread thread3=new MyThread(“thread3“);MyThread threa
3、d4=new MyThread(“thread4“);System.err.println(“准备启动线程.“);thread1.start();thread2.start();thread3.start();thread4.start();System.err.println(“子线程已全部启动,主线程结束n.“); class MyThread extends Threadprivate int sleepTime;public MyThread(String name)super(name);sleepTime=(int)(Math.random()*5001);public void
4、run()trySystem.err.println(getName()+“将休眠“+sleepTime+“毫秒“); Thread.sleep(sleepTime);catch(InterruptedException exception)exception.printStackTrace();System.err.println(getName()+“结束休眠“); 运行结果:思考 1、请问源程序中的 Thread.sleep(sleppTime)的作用是什么?如果将 sleepTime 的值换成 2000 或 10000,则程序运行结果有什么变化? 答:作用是叫线程先睡眠 05 秒之间,
5、换后结果为线程先睡眠 2 秒或 10 秒实验实验 2 一个实现一个实现 Runnable 接口的小应用程序接口的小应用程序一、实验目的一、实验目的 1、学习 Runnable 接口在 Appplet 程序中的使用; 2、掌握 Runnable 接口实现多线程的优点;3、加深对 Applet 中的几个常用方法的理解。 二、实验任务二、实验任务 在这个实验中要设计一个能显示时间的 Applet 程序,要完成这个实验,学 生应对 Applet 程序有个基本的了解,我们会先运行一个有些错误的程序,然后 在分析错误的原因之后,逐步修改已得到正确的程序。 三、实验步骤三、实验步骤程序清单程序清单 132:
6、 /AppletNoThread.javaimport javax.swing.*;import java.util.*;import java.awt.*;public class AppletNoThread extends JAppletint hours,mins,secs;public void start()Calendar time=Calendar.getInstance();hours=time.get(Calendar.HOUR);mins=time.get(Calendar.MINUTE);secs=time.get(Calendar.SECOND);System.out
7、.println(“秒:“+secs); repaint();public void paint(Graphics g)super.paint(g);g.drawString(String.valueOf(hours)+“:“+String.valueOf(mins)+“:“+String.valueOf(secs),50,50);运行结果:运行结果:程序清单 133: / AppletNoThreaded.javaimport javax.swing.*;import java.util.*;import java.awt.*;public class AppletNoThread exte
8、nds JApplet implements RunnableThread appletThread;int hours,mins,secs;public void start()appletThread=new Thread(this);appletThread.start();public void run()while(true)Calendar timeCalendar=Calendar.getInstance();hours=timeCalendar.get(Calendar.HOUR);mins=timeCalendar.get(Calendar.MINUTE);secs=time
9、Calendar.get(Calendar.SECOND);System.out.println(“秒:“+secs); repaint();public void paint(Graphics g)super.paint(g);g.drawString(String.valueOf(hours)+“:“+String.valueOf(mins)+“:“+String.valueOf(secs),50,50);运行结果:思考思考 编好程序并保存,然后编译运行,这次 Applet 程序能动态实时显示时间吗?同 时,再试试 Applet 右上角的关闭按钮能否起作用?请解释前后两个程序的差别?答:能
10、动态显示时间;右上角的关闭按钮也能正常使用;第二个程序创建了线 程,可以通过中断线程结束,第一个程序运行中始终独占 CPU 资源。实验三实验三 线程同步与资源共享线程同步与资源共享一、实验目的一、实验目的 1、 理解线程同步的含义; 2、 掌握 synchronized 同步方法与其同步语句的用法; 3、 学会使用 Thread Group 控制线程。 二、实验任务:二、实验任务: 本实验要用程序模拟一个银行账户存款的过程。程序中会有多个线程同时对一 个银行账户进行操作,每个线程的操作都按相同的步骤进行,即先查出该账户 当前的余额,在此基础上加 1,然后又把新余额写回账户上,这样连续执行若 干
11、次,最后账户上的余额就会累加成一个新余额值。由于银行账户是临界资源, 一次只能有一个程序,一个是没有实施线程同步的程序,另一个是实施线程同 步的程序,分别运行两个程序,可以看出来线程同步的作用。 三、实验内容三、实验内容 程序清单 134: /AccountWithoutSync.javapublic class AccountWithoutSyncprivate Account bank=new Account();private Thread threads=new Thread100;public static void main(String args)AccountWithoutSy
12、nc test=new AccountWithoutSync();System.out.println(“最后存款是:“+test.bank.getBalance(); public AccountWithoutSync()for(int i=0;i100;i+)threadsi=new Thread(new PayInThread();threadsi.start();class PayInThread extends Threadpublic void run()int balance;balance=bank.getBalance()+1;tryThread.sleep(10); cat
13、ch (InterruptedException ex)System.out.println(ex);bank.setBalance(balance);class Accountprivate int balance=0;public int getBalance()return balance;public void setBalance(int balance)this.balance=balance;运行结果:实验四实验四 wait()和()和 notify()挂起与恢复线程()挂起与恢复线程一、实验目的一、实验目的 1) 理解线程的挂起与恢复的概念; 2) 掌握 wait()与 not
14、ify()方法的使用。 二、实验任务二、实验任务 编写一个 Applet 小应用程序能够显示时间,当用户最小化 Applet 时,程序会 被挂起,当还原 Applet 时,程序又会恢复执行,同时 Applet 中应显示挂起和 恢复的时间。 三、实验步骤、实验步骤 程序清单 136: /SuspendResumeApplet.javaimport javax.swing.*;import java.util.*;import java.awt.*;public class SuspendResumeApplet extends JApplet implements RunnableThread
15、appletThread;boolean suspendFlag;Calendar time,suspendTime,resumeTime;int hours,mins,secs,sushours,susmins,sussecs,rehours,remins,resecs;public void init()suspendFlag=false;appletThread=new Thread(this);appletThread.start();public void start()resumeThread();public void stop()suspendThread();suspendT
16、ime=time;sushours=suspendTime.get(Calendar.HOUR);susmins=suspendTime.get(Calendar.MINUTE);sussecs=suspendTime.get(Calendar.SECOND);public synchronized void resumeThread()if(suspendFlag)suspendFlag=false;notify();resumeTime=Calendar.getInstance();rehours=resumeTime.get(Calendar.HOUR);remins=resumeTime.get(Calendar.MINUTE);resecs=resumeTime.get(Calendar.SECOND);pr