一、选择题
1. Java语言中负责并发管理机制是 ( D )
A. 垃圾回收
B. 虚拟机
C. 代码安全
D. 多线程
2.下列关于线程的说法,正确的是 ( B )
A. 两个线程可以共享各类资源
B. 一个进程可以包含多个线程
C. 一个线程可以包含多个进程
D. 单个CPU的计算机上,2个线程实际上不能并发执行
解析:
在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)。
但无论如何,都是通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。并发和并行是即相似又有区别(微观概念):
- 并行:指两个或多个事件在同一时刻点发生;
- 并发:指两个或多个事件在同一时间段内发生。
3. 当线程调用start()方法后,其所处状态为 ( C )
A. 阻塞状态
B. 运行状态
C. 就绪状态
D. 新建状态
解析:线程的五个状态也就是它的生命周期:
新建状态----通过new关键字来创建线程对象
就绪状态----调用start()方法
运行状态----调用run()方法
阻塞状态----调用sleep()、wait()、join() 、yield()、interrupt ()等方法
消亡状态----调用stop()方法,但是此方法已经过时
4. 下列关于线程的优先级说法中,正确的是 ( BD )
A. 线程的优先级是不能改变的
B. 线程的优先级是在创建线程时设置的
C. 在创建线程后的任何时候都可以重新设置
D. 线程的优先级的范围在1-10之间
解析:线程的优先级可以通过setPriority(int newPriority)的方法进行设置
线程一共有三个优先级,分别是:最低优先级(1) 中等优先级(5)
最高优先级(10),咱们经常写的main方法就是中等优先级线程。A:线程的优先级是可以更改也可以获取,但是有一点,即使设置为最高优先级也不一定先执行,只是它优先执行的几率比较高。
B:线程的优先级是在创建时进行设置,通过setPriority()方法设置
C:正在执行的线程是不允许重新设置线程优先级的。
5. 以下选项中关于Java中线程控制方法的说法正确的是 ( AD )
A. join () 的作用是阻塞指定线程等到另一个线程完成以后再继续执行
B. sleep () 的作用是让当前正在执行线程暂停,线程将转入就绪状态
C. yield () 的作用是使线程停止运行一段时间,将处于就绪状态
D. setDaemon()的作用是将指定的线程设置成守护线程
解析:
A:join()方法—线程的强制加入,加入的线程执行完毕之后再执行其他线程
B:sleep()方法—线程休眠,等时间过时,线程处于运行状态
C:yield()方法—线程礼让,让出CUP资源,其他线程先执行,有些与join()。
D:setDaemon()方法--将指定的线程设置成后台线程
6. 关于sleep()和wait(),以下描述错误的一项是 ( D ) 单选题
A. sleep是线程类(Thread)的方法,wait是Object类的方法
B. sleep不释放对象锁,wait放弃对象锁
C. sleep暂停线程、但监控状态任然保持,结束后会自动恢复
D. wait后进入等待锁定池,只针对此对象发出notify方法后获取对象锁进入运行状态。
解析:
针对此对象的notify方法后获取对象锁并进入就绪状态,而不是运行状态。另外针对此对象的notifyAll方法后也可能获取对象锁并进入就绪状态,而不是运行状态
7. 以下锁机机制中,不能保证线程安全的是 ( C ) 单选题
A. Lock
B. Synchronized
C. Volatile
8. 下面关于线程池好处说法不正确的是 ( D )
A. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
B. 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
C. 提高线程的可管理性。
D. 建立线程池会额外增加系统开销
9. 单选题 以下说法错误的是? ( D )
A. sleep方法的参数是以毫秒为单位的
B. 使用实现Runnable接口的方式创建线程,一定要重写run方法
C. 当创建线程对象,线程即进入新建状态
D. 调用sleep方法时,不需要处理异常
10. 下列对关键字synchronized说法错误的是 ( C )
A. synchronized(同步),即协调不同线程之间的工作
B. synchronized关键字可以用在成员方法中
C. 保证多个线程可以同时执行和结束
D. 保证共享对象在同一时刻只能被一个线程访问
11. 以下说法错误的是?(选择一项) ( D )
A. wait()方法用于使线程等待
B. notify()方法用于唤醒一个线程
C. notifyAll()方法用于唤醒多个线程
D. 使用wait()方法阻塞的线程,可以不用唤醒
12. 如果一个list初始化为{5,3,1},执行以下代码后,其结果为 ( B )
nums.add(6);
nums.add(0,4);
nums.remove(1);
A. [5, 3, 1, 6]
B. [4, 3, 1, 6]
C. [4, 3, 6]
D. [5, 3, 6]
13. 单选题 已知ArrayList的对象是list,以下哪个方法是判断ArrayList中是否包含”Hello”? ( A )
A. list.contains("hello");
B. list.add("hello");
C. list.remove("hello");
D. list.get("hello");
14. 单选题 下列哪个方法可以获取列表指定位置处的元素 ( D )
A. add(E e)
B. remove()
C. size()
D. get(int index)
15. 多选题 下列有关HashSet的描述正确的是 ( AC )
A. HashSet是Set的一个重要实现类
B. HashSet中的元素无序但可以重复
C. HashSet中只允许一个null元素
D. 不适用于存取和查找
16. 单选题 以下关于Set对象的创建错误的是? ( A )
A. Set set=new Set();
B. Set set=new HashSet();
C. HashSet set=new HashSet();
D. Set set=new HashSet(10);
17.以下关于Set和List的说法,正确的是? ( C )
A. Set中的元素是可以重复的
B. List中的元素是无序的
C. HashSet中只允许有一个null元素
D. List中的元素是不可以重复的
18. 下面哪个Set是排序的? ( C )
A. LinkedHashSet
B. HashSet
C. TreeSet
D. AbstractSet
19. 下列关于泛型的说法,错误的是 ( C )
A. 泛型是一种参数化类型
B. 增强了程序的灵活性和安全性
C. 可以取代继承机制
D. 泛型是JDK1.5出现的新特性
20. 关于枚举说法不正确的是 ( D )
A. 枚举是一组常量的集合
B. 不需要提供Set方法,枚举对象值通常为只读。
C. 对枚举对象/属性使用final和static关键字修饰,实现底层优化
D. 枚举对象名通常使用全部小写,常量的命名规范
二、简答题
1. ArrayList和LinkedList的区别
- 数据结构不同 (数组 双向链表)
2.List和Set的区别
- List:有序可重复
- Set:无序不可重复
3.Set集合如何确保数据的不重复?
- 重写hashcoce()和equals()
4.run()和start()的区别
- start()启动线程,线程进入就绪状态
- run() 执行线程任务,线程是running运行状态
三、上机题
第一题:把成绩低于80的成绩从集合中删除
首先定义一个ArrayList集合,在生成随机数,把成绩随机生成出来存到集合中,
最后在遍历集合,把成绩小于80的从集合中删除,删除用到remove()方法
import java.util.ArrayList;
import java.util.Random;
//成绩低于80的从集合中删除
public class ArrayList01 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Random r = new Random();
for (int i = 0; i < 20; i++) {
int i1 = r.nextInt(100);
list.add(i1);
}
for (int i = 0; i < list.size(); i++) {
int score = list.get(i);
if (score < 80){
list.remove(i);
i--;
}
}
System.out.println(list);
}
}
第二题:写两个线程,一个线程打印 1-52,另一个线程打印A-Z,打印顺序是12A34B…5152Z
class Print1{
private int flag=1;
private int count=1;
public synchronized void printNum(){
while (flag!=1){
try{
wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
System.out.print(2*count-1 );
System.out.print(2*count);
flag=2;
notify();
}
public synchronized void Zimu(){
while (flag!=2){
try{
wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
System.out.print((char)(count-1+'A'));
count++;
flag=1;
notify();
}
}
public class TestAA {
public static void main(String[] args) {
Print1 print=new Print1();
new Thread (()->{
for(int i=0;i<26;i++){
print.printNum();
}
}).start();
new Thread(()->{
for(int i=0;i<26;i++){
print.Zimu();
}
}).start();
}
}