多线程小测验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、单选题(每题3分,共计15分)
1、在以下哪种情况下,线程进入就绪状态?
A、线程调用了sleep()方法时
B、线程调用了join()方法
C、线程调用了yield()方法时
D、线程调用了notify()方法
2、如果线程正处于运行状态,则它可能到达的下一个状态是( )
A、只有终止状态
B、只有阻塞状态和终止状态
C、可运行状态,阻塞状态,终止状态
D、其他所有状态
3、以下哪种原因不会导致线程暂停运行。
A、等待
B、阻塞
C、休眠
D、挂起及由于I/O操作而阻塞
4、Thread类位于下列哪个包中?
A、java.io
B、ng
C、java.util
D、java.awt
5、线程调用sleep()方法后,该线程将进入以下哪种状态?
A、就绪状态
B、运行状态
C、阻塞状态
D、死亡状态
二多选题(每题5分,共计25分)
1、对于通过实现Runnable接口创建线程,下面说法正确的有哪些?
A、适合多个相同程序代码的线程去处理同一个资源的情况
B、把线程同程序代码、数据有效的分离,很好的体现了面向对象的设计思想
C、可以避免由于Java的单继承带来的局限性
D、编写简单,可以不通过Thread类直接创建线程
2、下面四个选项中,哪些是线程进入阻塞状态的原因?
A、线程试图获取某个对象的同步锁,而该锁被其它线程持有
B、线程调用了另一个线程的join()方法
C、当线程调用了一个阻塞式的IO方法
D、线程调用了setDaemon(boolean b)方法
3、对于wait()方法,下面说法正确的是?
A、wait()方法的调用者是同步锁对象
B、wait()方法使线程进入等待状态
C、调用同一锁对象的notify()或notifyAll()方法可以唤醒调用wait()方法等待的线程
D、调用wait()方法的线程会释放同步锁对象
4、对于死锁的描述,下面四种说法正确有哪些?
A、当两个线程互相等待对方释放同步锁时会发生死锁
B、Java虚拟机没有检测和处理死锁的措施
C、一旦出现死锁,程序会发生异常
D、处于死锁状态的线程处于阻塞状态,无法继续运行
5、关于线程的创建过程,下面四种说法正确的有哪些?
A、定义Thread类的子类,重写Thread类的run()方法,创建该子类的实例对象,调用对象的start()方法
B、定义Thread类的子类,重写Thread类的run()方法,创建该子类的实例对象,调用对象的run()方法
C、定义一个实现Runnable 接口的类并实现run()方法,创建该类实例对象,将其作为参数传递给Thread 类的构造方法来创建Thread对象,调用Thread对象的start()方法
D、定义一个实现Runnable 接口的类并实现run()方法,创建该类对象,然后调用run()方法
三、判断题(对的打“√”,错的打“×”;每题2分,共10分)
1、当调用一个正在运行线程的stop()方法时,该线程便会进入休眠状态。(F)
2、一个线程可以调用yield方法使其他线程有机会运行。(T)
3、线程结束等待或者阻塞状态后,会进入运行状态。(T)
4、静态方法不能使用synchronized关键字来修饰。(F)
5、如果前台线程全部死亡,后台线程也会自动死亡。(T)
四、填空题(每题4分,共计20分)
1、线程的优先级用1~10之间的整数来表示,其中___10_____代表优先级最高,___1_____代表优先级最低。
2、要将某个线程设置为后台线程,需要调用该线程的___setDameon_____方法,该方法必须在__start()______方法之前调用。
3、在Java语言中,同步方法需要用到关键字__synchronized______,对于同步方法而言无需指定同步锁,它的同步锁是方法所在的__对象______,也就是__this______(关键字)
4、一个应用程序中有多条并发执行的线索,每条线索都被称作一个__线程______,它们会交替执行,彼此间可以进行通信。
5、线程的整个生命周期分为五个阶段,分别是__新建状态(new)______、___就绪状态(Runnable)_____、__运行状态(Running)______、___阻塞状态(Blocked)_____和__死亡状态(Terminated)______。
五多选题(每题10分,共计30分)
1、请按照题目的要求编写程序并给出运行结果。模拟传智播客的三个老师同时分发80份学习笔记,每个老师相当于一个线程。
public class Test01 { public static void main(String[] args) { Teacher t = new Teacher(); new Thread(t, "陈老师").start(); new Thread(t, "高老师").start(); new Thread(t, "李老师").start(); }}class Teacher implements Runnable { private int notes = 80; public void run() { while (true) { dispatchNotes(); // 调用售票方法if (notes <= 0) { break; } } } priva te synchronized void dispatchNotes() { if (notes > 0) { try { Thread.sleep(10); // 经过的线程休眠10毫秒} catch (InterruptedException e)
{ e.printStackTrace(); } System.out.pri ntln(Thread.currentThread().getName() + "---发出的笔记" + notes--); } }}
2、请按照题目的要求编写程序并给出运行结果。通过继承Thread类的方式创建两个线程,在Thread构造方法中指定线程的名字,并将这两个线程的名字打印出来。
public class MyThread extends Thread{ public MyThread(String name)
{ super(name); } public void run()
{ System.out.println(this.getName()); } public static void
main(String[] args) { new MyThread("Thread1").start(); new MyThread("Thread2").start(); }}
3、请简述什么是线程。
线程是一个程序的执行流,执行调度的单位,依托于进程存在。线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈,是在建立线程时由系统分配的,主要用来保存线程内部所使用的数据,如线程执行函数中所定义的变量。