狂翔IT工作室 多线程试程
一. 选择题
1. 下列说法中,正确的一项是()  A
A. 单处理机的计算机上,2个纯种一官半职直不能并发执行
B. 单处理机的计算机上,2个线程实际能够并发执行
C. 一个线程可以包含多个线程
D. 一个进程只能包含一个线程
2. 下列说法中错误的一项是()A
A. 线程就是程序                    B.线程是一个程序的单个执行流
B. 多线程是指一个程序的多个执行流 D.多线程用于实现并发
3. 下列哪个一个操作不能使线程从等待阻塞状态进入对象阻塞状态(D
A. 等待阴塞状态下的线程被notify()
B. 等待阻塞状态下的纯种被interrput()中断
C. 等待时间到
D. 等待阻塞状态下的线程调用wait()方法
4. 下列哪个方法可以使线程从运行状态进入其他阻塞状态(A
A. sleep            B.wait            C.yield            D.start
5. 下列不是进程组成部分的一项是(D
A. 代码            B.数据            C.内核状态        D.显示器
6. 下列哪一个不属于java线程模型的组成部分(D
A. 虚拟的CPU                    B.虚拟CPU执行的代码
C. 代码所操作的数据                D.执行流
7. 下列说法中错误的一项是(C
A. Java中的第一个线程都属于某个线程组
B. 线程只能在其创建时设置所属的线程组
C. 线程创建之后,可以从一个线程组转移到另一个线程组
D. 新建的线程默认情况下属于其父线程所属的线程组
8. 下列不属于线程组成部分的一项是(C
A. 程序计数器                    B.堆栈
C. 进程地十空间中的代码            D.栈指针
9. 下列关于JAVA线程模型的说法中,错误的一项是(A
A. Java线程模型包括计算机的CPU    B.代码可以与其他线程共享
C. 数据可以被多个线程共享        D.线程模型在java.lang.Thread类中被定义
10. 下列说法中错误的一项是(D
A. 一个线程是一个Thread类的实例
B. 线程从传递给纯种的Runnable实例run()方法开始执行
C. 线程操作的数据来自Runnable实例
D. 新建的线程调用start()方法就能立即进入运行状态
11. 下列关于Thread类提供的线程控制方法的说法中,错误的一项是(D
A. 在线程A中执行线程B一个线程可以包含多个进程join()方法,则线程A等待直到B执行完成
B. 线程A通过调用interrupt()方法来中断其阻塞状态
C. 若线程A调用方法isAlive()返回值为true,则说明A正在执行中
D. currentThread()方法返回当前线程的引用
12. 下列说法中,错误的一项是()
A. 对象锁在synchronized()语句执行完之后由持有它的线程返还
B. 对象锁在synchronized()语句中出现异常时由持有它的线程返还
C. 当持有锁的线程调用了该对象的wait()方法时,线程将释放其持有的锁
D. 当持有锁的线程调用了该对象的构造方法时,线程将释放其持有的锁
13. 下面的哪一个关键字通宵用来对对象的加锁,从而使得对对象的访问是排他的  A
A. sirialize        B transient            C synchronized        D static
14. 下列关于线程的说法以中,正确的一项是(D
A. 由同一类创建的多个线程都同时运行结束
B. 创建线程只能通过继承java.lang.Thread
C. 调用suspend()方法暂停的一个线程将不会再被重新执行
D. 程序的执行完毕与超级线程(daemon threads)无关
15. 下列说法中错误的一项是(C
A. 可串行化的类必须实现Serializable接口
B. 可串行化的类中的静态变量可以不被串行化
C. private数据访问权限能够限制数据不被串行化
D. 对象串行化使用java语言提供的默认机制
16. 下列说法中错误的一项是(C
A. 可串行化的类必须实现Serializable接口
B. 可串行化的类中的静态变量可以不被串行化
C. private数据访问权限能够限制数据不被串行化
D. 对象串行化java语言提供的默认机制
17. 下列说法中正确的一项是(A
A. 代码和数据是进程的组成部分    B.代码和数据是线程的组成部分
C. 进程是轻型的线程                  D.线程中包括线程
        18. 下列说法中错误的一项是(C
        A.java的纯种体由Thread类的run()方法定义
        B.线程创建时已经确定了提供线程体的对象
          C.在程序中通过调用 Thread类的run()方法创建线程对象
        D.java中每一个线程都有自己的名字
19. 下列说法中错误的一项是(B
      A.共享数据的所有访问都必须使用synchronized加锁
      B.共享数据的访问不一定全部使用synchronized加锁
      C.所有的对共享数据的访问都是临界区
      D.临界区必须使用syschronized标识
20 下列有关线程的叙述中正确的一项是(B
      A.一旦一个线程被创建,它就立即开始运行
      B.使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行
      C.当一个线程因为抢占机制而停止运行时,它被放在可运行队列的前面
      D.一个线程可能因为不同的原因而终止并进入终止状态
二.填空题
    1. 在操作系统中,被称做轻型的进程是  线程
    2. 多线程程序设计的含义是可以将一个程序任务分成几个并行的  任务   
    3. Java程序中,run()方法的实现有两种方式:    实现Runnable接口        继承Thread       
    4.线程的高度是指在单个CPU上以某种顺序运行多个    线程       
    5.多个线程并发执行时,各个线程中语句的执行顺序是        确定    的,但是线程之间的相对执行顺序是    不确定   
    6.Java中的对象锁是一种独占的    排他   
    7.程序中可能出现一种情况:多个纯种互相等待对方持有的锁,而在得到对方的锁之前都不会释放自己的锁,这就是    死锁    .
    8.    notyfyAll()    方法将对象wait pool中的所有纯种都移到lock pool中。
    9.在一个线程中,建议使用    标志    ,而不使用    stop()    方法终止另一个线程。
    10.Java线程组把一组线程看做一个    对象    进行统一处理。
    11.进程是一个    内核    级的实体,而线程是一个  用户  级的实体
    12.Java线程模型中的    数据        代码    构成了线程体。
    13.线程的优先级是在Thread类的常数    MIN_PRIORITY        MAX_PRIORITY    之间的一个值
    14.Java的线程高度策略是基于        优先级            抢占式调度   
    15.处于新建状态的线程可以使用的控制方法是  start()    stop()   
    16.一个进程可以包含多个        线程       
    17.多任务操作系统运行多个  进程  来并发地执行多个任务
    18.线程是由表示程序运行状态的  寄存器  组成的
    19.多线程允许单个程序创建多个  并行执行  的线程来完成多个子任务
20.Thread类中表示最高优先级的常量是    getPriority() ,而表示最低优先级的常量是  setPriority(0    .
三.简答题
1. 简述 synchronized urrent.locks.Lock 的异同 
答: 主要相同点: Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
2.理解几个概念对象锁、sleepwaitnotifynotifyAll
    对象锁:每个对象都有对象锁,当某个线程进入用synchronized定义方法时,就获得了当前类对象(方法所属的类的对象)的锁,其他线程就不能再获得该锁,直到线程释放该锁。一个类对象有一个对象锁,多个同步方法公用一个对象锁。
sleep:是当前线程处于休眠状态,将对cpu的控制权交给其他线程,但不释放当前对象的锁,其他线程可以获得cpu,但不能进入当前线程控制的对象锁。
wait:与sleep的区别是,它会释放对象锁,其他线程可以进入该同步块。
notify:进入当前同步块的线程调用wait方法变成休眠状态的线程,notify将该线程变成等待状态。
notifyAll:进入当前同步块的线程调用wait方法变成休眠状态,notifyAll使所有休眠线程变成等待状态。 
一个类中有多个同步方法,进入任意一个同步块都将获得该对象锁,由于wait方法使进入同步块的线程休眠,notify只能唤醒所有被休眠线程中的一个,notifyAll可以唤醒所有休眠线程。通常线程的通信通过waitnotifyAllwait条件来实现。
3.java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法 ? stop() suspend() 法为何不推荐使用?
    答:有两种实现方法,分别是继承 Thread类与实现Runnable接口
synchronized关键字修饰同步方法
对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果 很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此 时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一
个锁定的资源,就 会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。
4. sleep()    wait()  有什么区别
    答: sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。waitObject类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。