多线程练习题目

更新时间:2024-03-18 03:30:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

多 线 程

一、单项

1.下述哪个选项为真?( )

A.Error类是一个RoutimeException异常

B.任何抛出一个RoutimeException异常的语句必须包含在try块之内 C.任何抛出一个Error对象的语句必须包含在try块之内 D. 任何抛出一个Exception异常的语句必须包含在try块之内

2.下列关于Java线程的说法哪些是正确的?( )

A.每一个Java线程可以看成由代码、一个真实的CPU以及数据3部分组成

B.创建线程的两种方法,从Thread类中继承的创建方式可以防止出现多父类问题 C.Thread类属于java.util程序包 D.以上说法无一正确

3.哪个关键字可以对对象加互斥锁?( )

A.transient B.synchronized C.serialize D.static

4.下列哪个方法可用于创建一个可运行的类?()

A.public class X implements Runable { public void run() {……} } B. public class X implements Thread { public void run() {……} } C. public class X implements Thread { public int run() {……} }

D.public class X implements Runable { protected void run() {……} }

5.下面哪个选项不会直接引起线程停止执行?( ) A.从一个同步语句块中退出来 B.调用一个对象的wait方法

C.调用一个输入流对象的read方法

D.调用一个线程对象的setPriority方法

6.使当前线程进入阻塞状态,直到被唤醒的方法是( )

A.resume()方法 B.wait()方法 C.suspend()方法 D.notify()方法

7.运行下列程序,会产生的结果是( )

public class X extends Thread implements Runnable {

public void run(){

System.out.println(“this is run()”); }

public static void main(String[] args) {

Thread t=new Thread(new X()); t.start(); } }

A.第一行会发生编译错误 B. 第六行会发生编译错误 C.第六行会发生运行错误 D.程序会运行和启动

8.java.lang.ThreadGroup类的作用为 ( ) A.使任何类都可以为线程提供线程体 B.定义了线程与交互的方法

C.提供了线程组或组中的每个线程进行操作的方法 D.以上都不是

9.实现线程的创建有( )方法

A.一种 B. 两种 C.三种 D.四种

10.一个进程可以包含( )个线程 A.一 B. 二 C. 三 D.四

11.Java中的线程模型包含( )

A.一个虚拟处理机 B.CPU执行的代码 C.代码操作的数据 D.以上都是

12.关于线程组以下说法错误的是( )

A.在应用程序中线程可以独立存在,不一定要属于某个线程 B.一个线程只能创建时设置其线程组

C.线程组由java.lang包中的ThreadGroup类实现

D.线程组使一组线程可以作为一个对象进行统一处里或维护

13.下列定义线程方法正确的是( ) A.Public Thread();

B.Public Thread(Runnable target);

C.Public Thread(ThreadGroup group,Runnable target); D.以上都正确

14.以下不属于Thread类提供的线程控制方法是( ) A.break() B.sleep() C.yield() D.join()

15.下列关于线程的说法正确的是( ) A.线程就是进程

B.线程在操作系统出现后就产生了 C.Soloris是支持线程的操作系统

D.在单处理器和多处理器上多个线程不可以并发执行

16.下列不属于线程生命周期状态的是( ) A. 新建状态 B.可运行状态 C. 运行状态 D.解锁状态

17.以下不属于Thread类的线程优先级静态常量的是( ) A.MIN_PRIORITY

B.MAX__PRIORITY C.NORM__PRIORITY D.BEST__PRIORITY

18.( )关键字可以对对象加互斥锁。

A.synchronized B.transient C.serialize D.static

19.下列( )方法和resume()方法相互搭配,使线程停止执行,然后调用resume()方法恢复线程。 A.interrupt() B.stop() C.suspend() D.yield()

20.Thread类的方法中,getName()方法的作用是( ) A.返回线程组的名称 B.设置线程组的名称 C.返回线程的名称 D.设置线程的名称

21.线程调用了sleep()方法后,该线程将进入( )状态

A.可运行状态 B.运行状态 C.阻塞状态 D.终止状态

22.下列( )类或接口定义了线程同步与交互的方法。

A.Thread B.Runnable C.Object D.ThreadGroup

23.Java中线程是由线程类的( )方法定义的。

A.init() B.run() C.application() D.main()

24.线程控制方法中,stop()的作用是( ) A.强行终止线程

B.使比其低的优先级线程运行 C.只让给同优先级运行 D.返回当前线程的引用

25.在以下( )情况下,线程就进入可运行状态。 A.线程调用了sleep()方法时 B.线程调用了join()方法时 C.线程调用了yield()方法时 D.以上都是

26.下列说法中,正确的一项是( )

A. 单处理机的计算机上,2个线程实际上不能并发执行 B. 单处理机的计算机上,2个线程实际上能够并发执行 C. 一个线程可以包含多个进程 D. 一个进程可以包含多个线程

27.下列说法中错误的一项是( ) A.线程就是程序

B.线程是一个程序的单个执行流 C.多线程是指一个程序的多个执行流 D.多线程用于实现并发

28.下列关于Thread类的线程控制方法的说法中错误的一项是( ) A.线程可以通过调用sleep()方法使比当前线程优先级的线程运行 B.线程可以通过调用yield()方法和当前线程优先级一样的线程运行 C.线程sleep()方法调用结束后,该线程进入运行状态

D.若没有相同优先级的线程处于可运行状态,县城调用yield()方法时,当前线程将继续执行

29.下列程序的输出结果是( ) package com.mytest.www; class C6 implements Runnable{ public void run() { for(int a=3;a<=10;a++){ if(isPrime(a)) System.out.print(a+\); } } public boolean isPrime(int n){ boolean b=true; for(int i=2;i

30.下列哪一个操作不能使线程从等待阻塞状态进入对象锁阻塞状态? A.等待阻塞状态下的线程被notify()唤醒 B.等待阻塞状态下的线程被interrput()中断 C.等待时间到

D.等待阻塞状态下的进程调用wait()方法

31.下列哪一个方法可以使线程从运行状态进入其他阻塞状态? A. sleep() B. wait() C. yield() D. start()

32.下列哪一个不属于Java线程模型的组成部分? A.虚拟的CPU

B.虚拟CPU执行的代码 C.代码所操作的数据 D.执行流

33.下列程序的输出结果是( )。 public class Test { public static void main(String args[]) { new Test(); } Test() { Test t1 = this; Test t2 = this; synchronized (t1) { try { t2.wait(); System.out.println(\); } catch (InterruptedException e) { System.out.println(\); } catch (Exception e) { System.out.println(\); } finally { System.out.println(\); } } System.out.println(\); } } A.输出“ALL DONE” B.输出“INTERRUPTED” C.输出“DONE WAITING”

D.编译通过,但是不输出任何字符串

34.下列哪一种情况一定不会使当前的 线程暂停执行?( ) A.该线程抛出一个InterruptedException B.该线程调用sleep()方法 C.该线程创建一个新的子线程 D.该线程从输入流读取文件数据

35.下列说法中错误的一项是( )

A.Java中的每一个线程都属于某个线程组 B.线程只能在其创建时设置所属的线程组

C.线程创建之后,可以从一个线程组转移到另一个线程组

D.新建的线程组默认情况下属于其父线程所属的线程组

36.下列不属于线程组成部分的一项是( ) A. 程序计数器 B. 堆栈 C. 进程地址空间中的代码 C. 栈指针

37.下列关于Java线程模型的说法中,错误的一项是( ) A.Java线程模型包括了计算机的CPU B.代码可以与其他线程共享 C.数据可以被多个线程共享

D.线程模型在java.lang.Thread类中被定义

38.下列关于Thread类提供的线程控制方法的说法中,错误的一项是( ) A.在线程a中执行线程b的join()方法,则线程a等待直到b执行完成 B.线程a通过调用interrupt()方法来中断其阻塞状态

C.若线程a调用方法isAlive()返回值为true,则说明a正在执行中 D.currentThread()方法返回当前线程的引用

39.下面的哪一个关键字通常用来对对象加锁,从而使得对对象的访问是排他的?( ) A. serialize B. transient C. synchronized D. static

40.下列说法中错误的一项是( )

A.可串行化的类必须实现Serializable接口 B.可串行化的类中的静态变量可以不被串行化 C.private数据访问权限能够限制数据不被串行化 D.对象串行化使用Java语言提供的默认机制

41.下列说法中正确的一项是( ) A.代码和数据是进程的组成部分 B.代码和数据是线程的组成部分 C.进程是轻型线程 D.线程中包含进程

42.下列说法中错误的一项是( )

A.共享数据的所有访问都必须使用synchronized加锁 B.共享数据的访问不一定全部使用synchronized加锁 C.所有的对共享数据的访问都是临界区 D.临界区必须使用synchronized标识

43.下列有关线程的叙述中正确的一项是( ) A.一旦一个线程都创建,它就立即开始运行

B.使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行 C.当一个线程因为抢占机制而停止运行时,它被放在课运行队列的前面 D.一个线程可能因为不同的原因停止并进入终止状态

44.下列方法中,不属于Thread类提供的线程控制方法的一个是( )

A. sleep() B. interrupt() C. init() D. yield()

45.实现Runnable接口创建一个线程的语句是( )

Thead t = new Thead (target) Thead t = new Thead ();

t.target=target

Thead t = new Thead ();

T.start(target)

Thead t = new Thead ();

T.run(target)

Thead类定义与下列哪一个包中?( )

A. java.io B. java.lang C. java.util D.

46.下列说法中,错误的一项是( )

A.实现了Runnable接口的类,可以通过extends来继承其他的类 B.实现了Runnable接口的类,不能继承其他的类 C.Thread类的子类应该是关于CPU行为的类 D.Thread类的子类也实现了Runnable接口

47.下列是通过实现Runnable接口创建的类,其中正确的一项是( ) A. class A3 implements Runnable

{

void run() {

//··········

} }

B. class A3 extends Runnable

{

public void run()

{

//··········

} }

C. class A3 implements Runnable

{

public void run()

{

//··········

} }

D. class A3 implements Runnable

{ //·········· }

java.awt

48.Thread类的常量 NORM_PRIORITY代表的优先级是( ) A.最低优先级 B.普通优先级 C.最高优先级

D.不代表任何优先级

50.下列哪一个包给出了Runnable接口的定义?( )

A. java.util B. java.io C. java.lang D. java.sql

二、填空题

1.线程模型在Java中是由________类进行定义和描述的。

2.多线程是Java程序的______机制,它能共享同步数据,处理不同事件。 3.Java的线程调度策略是一种基于优先级的_________。

4.当线程完成运行并结束后,将不能再运行。除线程正常运行结束外,还可用其他方法控制其停止。可以用_______方法强行终止线程。

5.如果一个线程处于______态,那么这个线程是不能运行的。

6.提供线程体的特定对象是在创建线程时指定的,创建线程对象是通过_____类的构造方法实现的。

7.在Java中,新建的线程调用start()方法,将使线程的状态从New(新建状态)转换为_____。 8.按照线程的模型,一个具体的线程是由虚拟的CPU、代码与数据组成,其中代码与数据构成了_______,现成的行为由它决定。

9.Thread类的方法中,toString()方法的作用是________。

10. 线程是一个_____级的实体,线程结构驻留在用户空间中,能够被普通的相应级别方法直接访问。

11. 线程是由表示程序运行状态的 组成的。

12. 在Java线程模型中,一个线程是由 、 和 三部分组成的。

13. Thread类中表示最高优先级的常量是 ,而表示最低优先级的常量是 。

14. 若要获得一个线程的优先级,可以使用方法 ,若要修改一个线程的优先

级,则可以使用方法 。

15. 在Java语言中临界区使用关键字 标识。

16. 线程的生命周期包括新建状态、 运行状态、 和终止状态。 17. Java语言使用 技术对共享数据操作进行并发控制。 18. 进程是由 、数据、内核状态和 组成的。 19. 在Java线程模型中,数据和代码之间的关系是 的。

20. 线程中 方法使执行线程放弃CPU并释放原来持有的对象锁,进入对象的

wait等待池中。

三、判断题

1.一旦一个线程被创建,它就可以立即开始运行( )

2.调用start()方法可以使一个线程成为可运行的,但是它并不能立即开始执行( ) 3.主线程不具有默认优先级( )

4.Java中线程的优先级从低到高以整数0—9表示( )

5. 从一个同步语句块中退出来不会直接引起线程停止执行( ) 6.线程的阻塞是指暂停一个线程的执行以等待某个条件发生( ) 7.优先级只能在线程启动前设置( )

8.当生成守护线程的线程结束时,此守护线程会随之消失( )

9.线程之间的通信可以通过共享数据使线程互相交流,也可以通过线程控制方法使线程互相等待( )

10.Object类定义了线程同步与交互的方法 ( )

11. 线程一旦被创建,则自动运行 ( )

12. 线程创建后需要调用start()方法,将线程置于可运行状态 ( ) 13. Thread类中没有定义run()方法 ( ) 14. 线程开始运行时,是从start()方法开始运行的( ) 15. 一个进程可以创建多个线程 ( ) 16. 代表优先级的常数值越大优先级越低 ( )

17. 程序中可能出现一种情况:多个线程相互等待对方持有的锁,而在得到对方的锁之前都不

会释放自己的锁,这就是死锁。 ( )

18. 临界区可以是一个语句块,但是不可以是一个方法 ( ) 19. 释放锁的时候,应该按照加锁顺序的逆序进行 ( )

20. 在对象串行化中,可以用来保护类中敏感信息的关键字是protected ( )

四、简答题(回答要点,并简明扼要作解释)10 1.什么是线程?它和进程有什么区别?

2.简述线程的生命周期。

3.Runnable接口中包括哪些抽象方法?Thread类有哪些主要域和方法?

4.创建线程有几种方式?试写出使用这些方式创建线程的一般模式。为什么有时候必须采用其中一种方式?

5.简述线程的同步控制机制。

6. 创建线程有哪两种方法?

7. 什么是死锁?

8. 线程有哪三种基本状态?这几种状态是怎样相互转换的?(可画图表示)

9. Java语言中的线程包括哪三部分?

10. 什么是进程?与线程有何区别?

五、程序设计题

1.编写一个多线程类,该类的构造方法调用Thread类带字符串参数的构造方法。建立自己的线程名,然后随机生成一个休眠时间,再将自己的线程名和休眠多长时间显示出来。该线程运行后,休眠一段时间,该时间就是在构造方法中生成的时间。最后编写一个测试类,创建多个不同名字的线程,并测试其运行情况。

2.编写一个程序,测试异常。该类提供一个输入整数的方法,使用这个方法先输入两个整数,再用第一个整数除以第二个整数,当第二个整数为0时,抛出异常,此时程序要捕获异常。

3.编写一个用线程实现一个数字时钟的应用程序。该线程类要采用休眠的方式,把绝对大部分时间让系统使用。

4.编写一个使用继承Thread类的方法实现多线程的程序。该类有两个属性,一个字符串代表线程名,一个整数代表该线程要休眠的时间。线程执行时,显示线程名和休眠时间。 5.应用继承类Thread的方法实现多线程类,该线程3次休眠若干(随机)毫秒后显示线程名和第几次执行。

6.请通过实现Runnable接口和继承Thread类分别创建线程,要求:除了main线程之外,还要创建一个新的线程。Main线程重复100次“main“,新线程重复100次输出“new”。

7. 为了使下面的程序能够输出“running”,请在注释处填写相关语句代替注释//A。 public class Test implements Runnable{ public static void main(String args[]){ Test test=new Test(); Thread t=new Thread(test); //A } public void run(){ System.out.println(\); } void go(){ start(1); } void start(int i){ } } 8. 在下列程序的横线处填入正确的语句 public class Test { public static void main(String args[]) { Thread t1 = new subTread(\); Thread t2 = new subTread(\); t1.start(); t2.start(); } } class subTread extends Thread { public subTread(String s) {

} public void run() { System.out.println(\ + getName()); try { sleep((int) (Math.random() * 1000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(\结束!\ + getName()); } } 9. 请创建一个线程,指定一个限定时间(如60s),线程运行时,大约每3s输出1次当前所剩时间,直至给定的限定时间用完。考点:sleep方法

10.以下是一个模拟订票业务的程序。BookingClerk类代表自动售票员,其中包含一个订票(booking)方法。假设一开始有10张票可预定。程序运行时产生两个订票客户同时自动向自动售票员订票。请问会出现什么错误?该如何修改?考点:临界区与互斥 public class Test { public static void main(String args[]) { BookingClerk bt = new BookingClerk(); new BookingTest(bt, 7); new BookingTest(bt, 5); } } class BookingClerk { int remainder = 10; void booking(int num) { if (num <= remainder) { System.out.println(\预定\ + num + \张\); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } remainder = remainder - num; } else { System.out.println(\剩余票不够,无法预定\); } System.out.println(\还剩\+remainder+\票\); } } class BookingTest implements Runnable { BookingClerk bt; int num; BookingTest(BookingClerk bt, int num) { this.bt = bt; this.num = num; new Thread(this).start(); } public void run() { bt.booking(num); } } 11 模拟一个生产者/消费者, 并且有两个条件限制: 一是库存有限制,不能无限制地生产(消费者消费); 二是产量有限制,一旦完成了设定的产量, 生产者线程就退出,当库存达到下限时生产者继续生产。

本文来源:https://www.bwwdw.com/article/chf8.html

Top