java 实验八 多线程 实验报告

2020-03-27 19:51

实验八多线程

实验目标:

(1)掌握使用Thread的子类创建线程;掌握实现Runable接口来实现多线程; (2)掌握线程之间的数据共享; (3)掌握线程之间的同步方法; (4)掌握线程之间的通信方法。

实验任务:

1、选择答题(请将答案标成红色,如(AB)):

1.下面关于线程的说法正确的是(ABD )。 A)Java 支持多线程机制。

B)一个线程创建并启动后,它将执行自己的run()方法,如果通过派生Thread类实现多线程,则需要在子类中重新定义run()方法,把需要执行的代码写run()方法中;如果通过实现Runnable接口实现多线程,则要编写run()方法的方法体。

C)要在程序中实现多线程,必须导入Thread类: import java.lang.Thread;

D)一个程序中的主类不是Thread的子类,该类也没有实现Runnable接口,则这个主类运行是不能控制主线程的休眠。

2.如果程序中创建了两个线程,一个的优先级是Thread.MAX_PRIORITY,另一个的优先级是正常的默认优先级,下列陈述哪个是对的?( A)

A)正常优先级的线程不运行,直到拥有最高优先级的线程停止运行。 B)即使拥有最高优先级的线程结束运行,正常优先级的线程也不会运行。 C)正常优先级的线程优先运行。 D)上述说法都不对。

3.下面哪个是Runnable接口中的抽象方法(D)?

A)start B)stop C)yield D)run

4.编译下面的程序,得到的结果是( C)。 public class A implements Runnable { public void run () { System.out.println(\ } public static void main (String[] args) { Thread Th=new Thread (new A()); Th.start(); }

}

A)程序不能编译,产生异常。

B)程序能编译运行,但没有任何结果输出。 C)程序能编译运行,输出结果:OK.。 D)上面说法都不对。

5.为什么处于激活状态的线程可能不是当前正在执行的线程?(BCD ) (备注:激活(unblock):如果阻塞线程的事件发生,则该线程被激活并进入就绪队列。) A)因为已经执行完run()方法。 B) 线程正在等待键盘输入。 C)该线程调用了wait()方法。 D)该线程正在休眠状态。

2. 下面是一个多线程的程序:

public class SimpleThread extends Thread { public SimpleThread(String str) { super(str); }

public void run() {

for (int i = 0; i < 10; i++) {

System.out.println(i + \ try {

sleep((long)(Math.random() * 1000)); } catch (InterruptedException e) {} }

System.out.println(\ } }

public class TwoThreadsTest {

public static void main (String[] args) { new SimpleThread(\ new SimpleThread(\ } }

(1) 输入该程序并运行之,体会多线程的程序的编写方法。 输入该程序后执行结果截图如下:

(2) 将该程序该为通过实现Runnable接口的方式实现多线程。 改为Runnable后程序代码如下:

package zi;

publicclass Ex8_2_2{ }

class Move implements Runnable {

Thread test1,test2; Move() { }

test1=new Thread(this); test1.setName(\); test2=new Thread(this); test2.setName(\);

publicstaticvoid main(String args[]) { }

Move move=new Move(); move.test1.start(); move.test2.start();

}

publicvoid run() { }

if(Thread.currentThread()==test1) { } else { }

for(int i=1;i<=5;i++) { }

System.out.println(test2.getName()); for(int i=1;i<=10;i++) { }

System.out.println(test1.getName());

运行结果截图如下:

3,课本270页课后习题第4题。

下面给出一个范例(只供参考):

(1)这个程序运行就是一个进程,根据要求要设计三个线程,首先给出一个协助三个线

程通信的类:

(2)接下来根据要求设计A线程和B线程,因为两个线程功能相同,所以可以是同一个类的不同实例对象,设计该类如下:

我们可以看到,基本设计方法与书本并无区别,同样为了协调三个线程之间通信,我们使用了一个通信类,根据规范操作,每个线程对通信类实例进行操作时,需要进行同步,就是

synchronized(so) { //获得锁旗标

具体执行就是根据题意,调用wait()等待,注意wait()跟sleep()是有区别的,前者会自动释放CPU和同步锁旗标,而后者会释放CPU,但不会释放同步锁旗标,在这里,由于三个线程都使用了同一个同步对象,因此,需要使用wait()(当然大家也可以不使用通信对象来完成这个题目)。(请大家详细看课本262页的解析) Wait()之后,就将自己至于就绪等待队列,然后

是唤醒其他线程,很明显在当前进程中,

一共才三个线程,A和B进入了wait状态,它们唤醒的就只有C了,于是C出场。

(3)关于C的类设计结构基本跟上面A、B类一样,就是在run方法里面根据要求编写,首先就是sleep一段时间,参数单位是毫秒,然后调用notifyall让A和B继续运行,A和B运行结束之后,自然会回到C运行,这时如何按题意来判断其他线程都已结束呢?我们可以再

so.wait();一次,作用是C放弃当前CPY与锁旗标,让其他线程先运行完毕,这个时候如果C线程重新开始回到CPU执行,意味着没有其他线程了,也就是可以判断AB已经执行完


java 实验八 多线程 实验报告.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:减免税管理办法

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: