java 实验八 多线程 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验八多线程
实验目标:
(1)掌握使用Thread的子类创建线程;掌握实现Runable接口来实现多线程;
(2)掌握线程之间的数据共享;
(3)掌握线程之间的同步方法;
(4)掌握线程之间的通信方法。
实验任务:
1、选择答题(请将答案标成红色,如(AB)):
1.下面关于线程的说法正确的是( ABD )。
A)Java 支持多线程机制。
B)一个线程创建并启动后,它将执行自己的run()方法,如果通过派生Thread类实现多线程,则需要在子类中重新定义run()方法,把需要执行的代码写run()方法中;如果通过实现Runnable接口实现多线程,则要编写run()方法的方法体。
C)要在程序中实现多线程,必须导入Thread类: import ng.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("OK.");
}
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 + " " + getName());
try {
sleep((long)(Math.random() * 1000));
} catch (InterruptedException e) {}
}
System.out.println("DONE! " + getName());
}
}
public class TwoThreadsTest {
public static void main (String[] args) {
new SimpleThread("Jamaica").start();
new SimpleThread("Fiji").start();
}
}
(1)输入该程序并运行之,体会多线程的程序的编写方法。输入该程序后执行结果截图如下:
(2)将该程序该为通过实现Runnable接口的方式实现多线程。改为Runnable后程序代码如下:
package zi;
public class Ex8_2_2{
public static void main(String args[])
{
Move move=new Move();
move.test1.start();
move.test2.start();
}
}
class Move implements Runnable
{
Thread test1,test2;
Move()
{
test1=new Thread(this);
test1.setName("Jamaica");
test2=new Thread(this);
test2.setName("Fiji");
}
public void run()
{
if(Thread.currentThread()==test1)
{
for(int i=1;i<=10;i++)
{
System.out.println(test1.getName());
}
}
else
{
for(int i=1;i<=5;i++)
{
System.out.println(test2.getName());
}
}
}
}
运行结果截图如下:
3,课本270页课后习题第4题。
下面给出一个范例(只供参考):
(1)这个程序运行就是一个进程,根据要求要设计三个线程,首先给出一个协助三个线