面向对象程序设计实验七 线程

上传人:第*** 文档编号:33619951 上传时间:2018-02-16 格式:DOC 页数:11 大小:1.70MB
返回 下载 相关 举报
面向对象程序设计实验七 线程_第1页
第1页 / 共11页
面向对象程序设计实验七 线程_第2页
第2页 / 共11页
面向对象程序设计实验七 线程_第3页
第3页 / 共11页
面向对象程序设计实验七 线程_第4页
第4页 / 共11页
面向对象程序设计实验七 线程_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《面向对象程序设计实验七 线程》由会员分享,可在线阅读,更多相关《面向对象程序设计实验七 线程(11页珍藏版)》请在金锄头文库上搜索。

1、实验七 线程云南大学信息学院 面向对象技术导论 java程序设计大学教程 实验【开发语言及实现平台或实验环境】Windows2000 或 XP,JDK1.6 与 Jcreator4.0 【实验目的】1. 理解线程的基本概念、优先级、生命周期等。2. 掌握线程的一般创建与使用方法(Thread 类与 Runnable接口) 。3. 了解线程间的通信、多线程的同步等编程机制。【实验要求】1. 运行上课讲解的例子;2. 完成下列实验内容。【实验内容】一、读懂并执行下列程序,理解 Java中的多线程机制。1. 运行下面的程序,理解用创建 Thread子类的方法实现多线程。class SimpleThr

2、ead extends Thread public SimpleThread(String str) super(str);public void run() for (int i = 0; i 10; i+) System.out.println(i + + getName();try sleep(int)(Math.random() * 1000); catch (InterruptedException e) System.out.println(DONE! + getName();public class TwoThreadsTest public static void main (

3、String args) new SimpleThread(Go to Beijing ).start();new SimpleThread(Stay here!).start();问题:(1) 程序的运行结果和功能分别是什么?(2) 如果程序中去掉 try-catch语句,程序是否仍能正常运行?(3) Thread子类是如何实现多线程机制的?(4) 如果希望执行三个线程,再显示“Go to Shanghai ”,程序如何修改?比较显示次序,是否相同。为什么会有这样的现象?答:1:运行结果:功能:创建两个线程并打印做检测2:去掉后程序能够正常运行但是运行的速度加快,即线程没有了等待时间。3:在

4、编写复杂程序时相关的类可能已经继承了某个基类,而 Java不支持多继承,在这种情况下,便需要通过实现 Runnable接口来生成多线程用到 Thread类的构造方法public Thread(Runnable target); /构造一个新的线程对象,以一个实现 Runnable接口的类的对象为参数。默认名为Thread-n,n 是从 0开始递增的整数。4:首先在函数 TwoThreadsTest添加一个线程即是添加语句 new SimpleThread(Go to Qinghai ).start();和 System.out.println(“Go to Shanghai”);即可由于学校的

5、机器是四核的无法完成下面的操作!2. 运行下面的程序,理解用实现 Runnable接口的方法实现多线程。/这是一个时钟 Applet,它显示当前时间并逐秒进行更新。import java.awt.*;import java.applet.*;import java.util.*;public class Clock extends Applet implements RunnableThread clockThread; public void start()if(clockThread=null)clockThread=new Thread(this,Clock);clockThread.s

6、tart();public void run()while(clockThread !=null)repaint();tryclockThread.sleep(1000);catch(InterruptedException e)public void paint(Graphics g)Date now=new Date();g.drawString(now.getHours()+;+now.getMinutes()+;+now.getSeconds(),5,10);public void stop()clockThread.stop();clockThread=null;问题:(1) 在什么

7、情况下一般要通过实现 runnable接口实现线程机制?(2) 程序的运行结果和功能分别是什么?(3) Runnable接口是如何实现多线程机制的?(4) 程序中是通过什么方法如何实现逐秒更新显示时间的?答:(1)在编写复杂程序时相关的类可能已经继承了某个基类,而 Java不支持多继承,在这种情况下,便需要通过实现 Runnable接口来生成多线程(2)结果:功能:该程序是一个时钟 Applet,它显示当前时间并逐秒进行更新。(3)定义一个实现 java.lang.Runnable接口的类,并在该类中定义 Runnable接口的run()方法,同样,该 run()方法是线程执行的起点。(4)程

8、序通过调用 clockThread.sleep()方法通过控改变 sleep()里面的内容来实现逐秒更新显示时间。3. 运行下面的程序,理解线程的同步。/程序使用同步块class Callmevoid call(String msg)System.out.print( + msg );tryThread.sleep(1000); catch (InterruptedException e)System.out.println(Interrupted);System.out.println();class Caller implements RunnableString msg;Callme t

9、arget;Thread t;public Caller(Callme targ, String s)target = targ;msg = s;t = new Thread(this);t.start();/同步调用 call()方法public void run()synchronized(target)/同步块target.call(msg);class Java2public static void main(String args)Callme target = new Callme();Caller ob1 = new Caller(target,Hello);Caller ob2

10、 = new Caller(target,Synchronized);Caller ob3 = new Caller(target,World);/等待线程结束tryob1.t.join();ob2.t.join();ob3.t.join(); catch(InterruptedException e)System.out.println(Interrupted);问题:(1) 程序的运行结果和功能分别是什么?(2) 程序中如何实现线程的同步?(3) 去掉程序中的 synchronized关键字,运行结果如何?答:1:运行结果功能:创建三个线程,检测线程同步。2 碰到多个线程对同一资源进行访问

11、的情况,这时,就需要协调: 每个对象都只有一个“锁”与之相连,利用多线程对其的争夺可实现线程间的互斥操作。当线程 A获得了一个对象的锁后,线程 B必须等待线程 A完成规定的操作、并释放出锁后,才能获得该对象的锁,并执行线程 B中的操作。利用 synchronized首先判断对象的锁是否在,如果在就获得锁,然后就可以执行紧随其后的代码段;如果对象的锁不在(已被其他线程拿走) ,就进入等待状态,直到获得锁3:去掉关键字后无运行结果。运行结果为空,三个线程均不被执行。4. 运行下面的程序,理解线程间的通信。import java.lang.Runnable;import java.lang.Thre

12、ad;public class DemoThread1 implements Runnablepublic DemoThread1() TestThread testthread1 = new TestThread(this,1);TestThread testthread2 = new TestThread(this,2);testthread2.start();testthread1.start();public static void main(String args) DemoThread1 demoThread1 = new DemoThread1();public void run

13、()TestThread t = (TestThread) Thread.currentThread();tryif (!t.getName().equalsIgnoreCase(1) synchronized(this) wait();while(true)System.out.println(thread+ t.getName()+ =+ t.increaseTime();if(t.getTime()%10 = 0) synchronized(this) System.out.println(*change thread*);this.notifyAll();if ( t.getTime(

14、)=20 ) break;wait();catch(Exception e)e.printStackTrace();class TestThread extends Threadprivate int time = 0 ;public TestThread(Runnable r,String name)super(r,name);public int getTime()return time;public int increaseTime ()return +time;问题:(1) 程序的运行结果和功能分别是什么?(2) 程序是如何实现线程通信的?可否通过其他方法进行线程间的通信?(3) 程序

15、中如果去掉 notify();语句,程序运行结果会怎样?为什么?(4) synchronized(this);语句的作用是什么?如果去掉此语句,能否实现线程间的通信?为什么?答:(1)程序结果:功能:创建两个线程并 notify();方法和 synchronized 关键词,实现线程的同步(2)程序是通过使用 java.lang.Object 类的 wait()方法为线程间的通讯提供了有效手段。可以调用 notify或 notifyAll方法来实现。(3)程序结果: 理由:在实际的多线程编程中,会碰到多个线程对同一资源进行访问的情况,这时,就需要协调,这种协调机制实现线程的同步,而 notify();语句就是唤醒一个等待的线程,本线程继续执行来实现线程的同步。(4)synchronized(this);语句的作用是:首先判断对象的锁是否在,如果在就获得锁,然后就可以执行紧随其后的代码段;如果对象的锁不在(已被其他线程拿走) ,就进入等待状态,直到获得锁。如果去掉此语句,不能实现线程间的通信。理由:会碰到程序中两个线程对同一资源进行访问的情况,去掉此语句该线程无法获得锁,从而进入等待状态,是程序出现异常。二、编写下列程序。模拟一个电子时钟,它可以在任何时候被启动或停止,并可独立运行。这个类称为Clock类,它继承 Label类。Label

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号