一.单选题(共14题,29.6分)
1下列关于进程和线程的说法中,错误的是()
- A、操作系统中每个独立执行的程序都可称之为一个进程
- B、线程和进程一样,是由CPU轮流执行的
- C、操作系统中的每一个进程中都至少存在一个线程
- D、线程和进程一样,是由CPU同时执行的
正确答案: D
2下面关于静态同步方法说法错误的是( )
- A、对于静态的同步方法而言,该方法的同步监视器不是this,而是该类本身。
- B、静态方法必须使用class对象同步。
- C、一个类中的多个同步静态方法可以同时被多个线程执行。
- D、静态同步方法和以当前类为同步监视器的同步代码块不能同时执行。
正确答案: C
答案解析:对于同步非静态方法而言,该方法的同步监视器是this,即调用该方法的Java对象;对于静态的同步方法而言,该方法的同步监视器不是this,而是该类本身。它们在类范围内是同步的,也就是同一时间只能有一个线程可以访问所有同步静态方法中的一个。
3在Java多线程中,wait()方法作用是( )
- A、导致线程等待
- B、唤醒线程
- C、线程休眠
- D、结束线程
正确答案: A
4下面关于join()方法描述正确的是( )
- A、join()方法是用于线程同步
- B、join()方法是用于线程插队
- C、join()方法是用于线程休眠
- D、join()方法是用于线程启动
正确答案: B
5下面关于yield()方法描述正确的是( )
- A、yield()方法是用于线程同步
- B、yield()方法是用于启动线程
- C、yield()方法是用于合并线程
- D、yield()方法是用于线程让步
正确答案: D
6下列关于同步代码块的特征说法错误的是( )
- A、可以解决多线程的安全问题
- B、使用synchronized关键字修饰
- C、多线程同步的锁只能是object对象
- D、降低程序的性能
正确答案: C
答案解析:同步代码块中的锁对象可以是任意类型的对象。
7下列关于Thread类的说法中,错误的是( )
- A、继承Thread类创建线程的方式可以防止出现多父类问题
- B、Thread类属于java.util包
- C、继承Thread的方式定义线程后,覆写的run()方法会在该线程的start()方法被调用后被JVM自动运行
- D、继承Thread的方式定义线程后,你不能在继承其他的类了,导致程序的可扩展性大大降低
正确答案: B
答案解析:Thread类属于java.lang包。
8关于Thread类join()方法的作用,下列描述中正确的是( )
- A、使线程由运行状态进入阻塞状态
- B、使线程由阻塞状态进入等待状态
- C、使线程由运行状态进入就绪状态
- D、使线程由阻塞状态进入运行状态
正确答案: A
答案解析:当在某个线程中调用其他线程的join()方法时,调用的线程将被阻塞。
9JAVA中调用Thread类的sleep()方法后,当前线程状态如何转换( )
- A、由阻塞状态进入等待状态
- B、由阻塞状态进入运行状态
- C、由运行状态进入阻塞状态
- D、由运行状态进入等待状态
正确答案: C
答案解析:sleep()方法使线程线程休眠,从运行状态进入到阻塞状态。
10阅读下列程序:
public class Demo extends Thread implements Runnable{ -----①
public void run(){
System.out.println("this is run()");
}
public static void main(String args[]){
Thread thread=new Thread(new Demo()); -----②
thread.start();
}
}
程序的运行结果是()
- A、程序正常执行输出this is run()
- B、①行出现编译错误
- C、②行出现编译错误
- D、出现运行错误
正确答案: A
11下列关于线程优先级的描述,错误的是( )
- A、一般情况下,主函数具有普通优先级
- B、优先级高的线程获得先执行权的几率越大
- C、NORM_PRIORITY代表普通优先级,默认值是5
- D、新建线程的优先级默认为最低
正确答案: D
答案解析:新建线程将继承创建它的父线程的优先级,因此不一定是最低的优先级。
12以下选项中可以正确定义一个同步代码块的是( )
- A、synchronized(对象){}
- B、synchronized(){}
- C、synchronized(任意基本数据类型){}
- D、synchronized(常量){}
正确答案: A
答案解析:
同步代码块的语法格式如下:
synchronized(lock){
操作共享资源代码块
}
其中lock是一个锁对象,锁对象可以是任意类型的对象。
13下列情况中,不会使线程返回所持有的对象锁的是( )
- A、当在synchronized()语句块中出现异常(exception)
- B、当调用了线程的suspend()方法
- C、当持有锁的线程调用该对象的wait()方法
- D、当synchronized()语句块执行完毕
正确答案: B
答案解析:suspend()方法表示如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前任何线程都不能访问该资源,已过时,不建议使用。
14关于Thread类yield()方法的作用,下列描述中正确的是( )
- A、使线程由阻塞状态进入等待状态
- B、使线程由阻塞状态进入运行状态
- C、使线程由运行状态进入阻塞状态
- D、使线程由运行状态进入就绪状态
正确答案: D
答案解析:yield()方法不会阻塞该线程,它只是将线程转换成就绪状态,让系统的调度器重新调度一次。
二.多选题(共9题,19.8分)
1请阅读下列代码:
Thread target=new MyThread();
read myThread=new Thread(target);
哪个选项不可以创建target对象并正确编译()
- A、public class MyThread extends Runnable { public void run(){} }
- B、public class MyThread extends Thread { public void run() {} }
- C、public class MyThread implements Runnable {public void run() {}}
- D、public class MyThread implements Thread {void run() {}}
正确答案: ABD
2以下关于解决死锁的说法正确的是( )
- A、使用打破循环等待条件的方法不能避免线程死锁
- B、打破互斥条件,即允许进程同时访问某些资源
- C、避免一个进程等待序列{P1,P2,...Pn},其中P1等待P2占有的某一资源,...Pn等待P1占有的某一资源,可以避免死锁
- D、打破不可抢占条件,即允许进程强行从某些资源占有者那里夺取资源
正确答案: BCD
3下面关于线程状态及转换的描述,正确的是()
- A、当线程对象调用了start()方法后,该线程就进入运行状态
- B、一旦进入死亡状态,线程将不再拥有运行的资格,也不能再转换到其他状态
- C、线程只能从新建状态转换到就绪状态,反之则不能
- D、线程从阻塞状态只能进入就绪状态,而不能直接进入运行状态
正确答案: BCD
4下列关于Runnable接口的说法,正确的是( )
- A、Runnable适合于多个相同程序代码线程去处理统一资源的情况
- B、Runnable可以使类在继承其他类的同时,还能实现多线程的功能
- C、Runnable可以避免由于java的单继承机制带来的局限
- D、Runnable能增加程序的健壮性,代码能够被多个线程共享
正确答案: ABCD
5请阅读下列程序:
public class Example {
public static void main(String[] args) {
SaleThread saleThread = new SaleThread(); // 创建Ticket1 对象
// 创建并开启四个线程
new Thread(saleThread, "窗口1 ").start();
new Thread(saleThread, "窗口2").start();
new Thread(saleThread, "窗口3").start();
new Thread(saleThread, "窗口4").start();
}
}
// 定义Ticket1类实现Runnable接口
class SaleThread implements Runnable {
private int tickets = 10; // 10张票
public void run() {
while (tickets > 0) {
try {
Thread.sleep(5); // 经过此处的线程休眠10毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "---卖出的票"
+ tickets--);
}
}
}
运行以上程序,可能的运行结果是( )
- A、同一张票被卖出两次
- B、10张票由同一个窗口卖出
- C、4个窗口各卖了10张票
- D、某个窗口卖出了负数张票
正确答案: AD
答案解析:由于发生线程的安全问题,卖出负数张票或者同一张票被卖出两次是有很有可能的。因为多线程共享资源,所以选项B和C均不可能,因此答案选AD。
6下列关于同步方法的描述中,正确的是( )
- A、同步方法也可以是静态方法
- B、同步方法也有锁,它的锁就是当前调用该方法的对象
- C、同步方法在某一时刻只允许一个线程访问
- D、同步方法可以节省资源,提高效率
正确答案: ABC
7下列有关Java进程和线程的说法,正确的是()
- A、操作系统中的每一个进程中都至少存在一个线程
- B、在多任务操作系统中,进程是可以并发执行的,例如可以一边听音乐一边聊天
- C、在一个操作系统中,每个独立执行的程序都可称之为一个进程,也就是“正在运行的程序”
- D、在一个进程中还可以有多个执行单元同时运行,这些执行单元可以看作程序执行的一条条线索,被称为线程
正确答案: ACD
8在Java基础案例教程中,当线程调用了某个对象的wait(long timeout)方法时,以下说法正确的是()
- A、可以等待限时时间结束后进行状态转换
- B、可以通过其他线程调用notifyAll()方法唤醒当前等待中的线程
- C、以上都正确
- D、可以通过其他线程调用notify()方法唤醒当前等待中的线程
正确答案: ABCD
9下列选项中,属于可以实现多线程程序方式的是()
- A、自己创建一个Thread类即可
- B、实现Comparable接口
- C、继承Thread类
- D、实现Runnable接口
正确答案: CD
三.填空题(共8题,17.6分)
1JAVA中thread类的sleep()方法可以让当前线程进入【】状态。
正确答案:
第一空:
休眠
2在Thread类中提供了一个【】方法来实现线程插队。
正确答案:
第一空:
join()
3Java中有两种创建线程的方式,一种是继承Thread类,另外一种是实现【】接口。
正确答案:
第一空:
Runnable
4在Java线程中,线程整个生命周期可以分为五个阶段,分别是【】、【】、运行状态、阻塞状态和【】。
正确答案:
第一空:
新建状态
第二空:
就绪状态
第三空:
死亡状态
5Java中线程让步可以通过【】方法来实现。
正确答案:
第一空:
yield()
6Java中静态方法的锁是该方法所在类的【】对象。
正确答案:
第一空:
class
7在Java中提供了两种多线程实现方式,其中一种是继承java.lang包下的【】类。
正确答案:
第一空:
Thread
8在Java多线程中,当多个线程使用同一个共享资源时,可以将处理共享资源的代码放在一个使用【】关键字修饰的代码块中。
正确答案:
第一空:
synchronized
四.判断题(共15题,33.0分)
1使用synchronized关键字修饰的代码块,被称作同步代码块。
正确答案:√
2Thread类中提供了一个join()方法,可以实现线程插队的功能。
正确答案:√
3线程对象创建完成时,该线程处于就绪状态。
正确答案:×
答案解析:线程对象创建完成时,线程处于新建状态。
4使用Thread类创建多线程程序可以实现资源共享。
正确答案:×
5线程的优先级数值越大,表示该线程的优先级越低。
正确答案:×
答案解析:线程的优先级数值越大,那么这个线程的优先级越高。
6实现Runnable接口方式创建线程同样需要重写run()方法。
正确答案:√
答案解析:run()方法是线程执行的主体,实现Runnable接口方式创建线程同样需要重写run()方法。
7线程可以通过继承Thread类或实现Runnable接口这两种方法来创建。
正确答案:√
8多线程操作共享资源一定会导致线程的安全问题。
正确答案:×
答案解析:多线程操作共享资源可能会导致线程的安全问题,也可能不会。
9实现Runnable接口相比继承Thread类方式创建线程,优点在于它解决了单继承带来的局限性。
正确答案:√
10Runnable接口中只有一个run()方法。
正确答案:√
11一个进程只能包含一个线程。
正确答案:×
12线程安全问题其实就是由多个线程同时处理共享资源所导致的,通过同步代码块能够解决该问题。
正确答案:√
答案解析:Java中提供了同步机制。当多个线程使用同一个共享资源时,可以将处理共享资源的代码放置在一个代码块中,使用synchronized关键字来修饰,被称作同步代码块。
13JAVA中Thread类的sleep()是静态方法,只能控制当前正在运行的线程休眠,而不能控制其他线程休眠。
正确答案:√
14在JAVA中一个类只要继承了java.lang.Thread类,那么这个类中的任何方法都会在该线程的start()方法被调用后被JVM自动运行。
正确答案:×
答案解析:在该线程的start()方法被调用后,除了run()方法其他方法不一定会被JVM自动运行。
15yield()方法和sleep()方法相同,都可以让当前正在运行的线程进入阻塞状态。
正确答案:×
答案解析:yield()方法和sleep()方法有点相似,都可以让当前正在运行的线程暂停,区别在于yield()方法不会阻塞该线程,它只是将线程转换成就绪状态,让系统的调度器重新调度一次。