第10章:随堂复习与企业真题(多线程)
第10章:随堂复习与企业真题(多线程)
一、随堂复习
1. 几个概念
1 | 程序(program):为完成特定任务,用某种语言编写的`一组指令的集合`。即指一段静态的代码。 |
1 | 线程调度策略 |
1 | > 单核CPU与多核CPU |
2. 如何创建多线程(重点)
- 方式1:继承Thread类
- 方式2:实现Runnable接口
- 方式3:实现Callable接口 (jdk5.0新增)
- 方式4:使用线程池(jdk5.0新增)
3. Thread类的常用方法、线程的生命周期
1 | 熟悉常用的构造器和方法: |
线程的生命周期:
jdk5.0之前:
jdk5.0及之后:Thread类中定义了一个内部类State
1 | public enum State { |
4. 如何解决线程安全问题(重点、难点)
什么是线程的安全问题?多个线程操作共享数据,就有可能出现安全问题。
如何解决线程的安全问题?有几种方式?
同步机制:① 同步代码块 ② 同步方法
- 重点关注两个事:共享数据及操作共享数据的代码;同步监视器(保证唯一性)
1
2在实现Runnable接口的方式中,同步监视器可以考虑使用:this。
在继承Thread类的方式中,同步监视器要慎用this,可以考虑使用:当前类.class。1
2非静态的同步方法,默认同步监视器是this
静态的同步方法,默认同步监视器是当前类本身。jdk5.0新增:Lock接口及其实现类。(保证多个线程共用同一个Lock的实例)
5. 同步机制相关的问题
- 懒汉式的线程安全的写法
- 同步机制会带来的问题:死锁
- 死锁产生的条件及规避方式
6. 线程间的通信
在同步机制下,考虑线程间的通信
wait() 、notify() 、notifyAll() 都需要使用在同步代码块或同步方法中。
高频笔试题:wait() / sleep()
二、企业真题
2.1 线程概述
1. 什么是线程(*云网络)
略
2. 线程和进程有什么区别(*团、腾*、*云网络、神**岳、言*有物、直*科技)
进程:对应一个运行中的程序。
线程:运行中的进程的一条或多条执行路径。
3. 多线程使用场景(嘉*医疗)
- 手机app应用的图片的下载
- 迅雷的下载
- Tomcat服务器上web应用,多个客户端发起请求,Tomcat针对多个请求开辟多个线程处理
2.2 如何实现多线程
1. 如何在Java中出实现多线程?(阿*校招、当*置业、鸿*网络、奥*医药、*科软、慧*、上海驿*软件、海*科)
1 | 类似问题: |
四种。
2. Thread类中的start()和run()有什么区别?(北京中油**、爱*信、神*泰岳、直*科技,*软国际,上海*学网络)
start():① 开启线程 ② 调用线程的run()
3. 启动一个线程是用run()还是start()?(*度)
start()
4. Java中Runnable和Callable有什么不同?(平*金服、银*数据、好*在、亿*征信、花儿**网络)
1 | 与之前的方式的对比:与Runnable方式的对比的好处 |
5. 什么是线程池,为什么要使用它?(上海明*物联网科技)
1 | 此方式的好处: |
2.3 常用方法、生命周期
1. sleep() 和 yield()区别?(神*泰岳)
sleep():一旦调用,就进入“阻塞”(或TIMED_WAITING状态)
yield():释放cpu的执行权,处在RUNNABLE的状态
2. 线程创建的中的方法、属性情况?(招通**、数*互融)
略
3. 线程的生命周期?(中国**电子商务中心、*科软、慧*)
略
4. 线程的基本状态以及状态之间的关系?(直*科技)
1 | 类似问题: |
略
5. stop()和suspend()方法为何不推荐使用?(上海驿*软件)
stop():一旦执行,线程就结束了,导致run()有未执行结束的代码。stop()会导致释放同步监视器,导致线程安全问题。
suspend():与resume()搭配使用,导致死锁。
6. Java 线程优先级是怎么定义的?(软*动力)
三个常量。[1,10]
2.4 线程安全与同步机制
1. 你如何理解线程安全的?线程安全问题是如何造成的?(*软国际)
1 | 类似问题: |
略
2. 多线程共用一个数据变量需要注意什么?(史*夫软件)
线程安全问题
3. 多线程保证线程安全一般有几种方式?(来*科技、北京*信天*)
1 | 类似问题: |
- 同步机制
- Lock接口
4. 用什么关键字修饰同步方法?(上海驿*软件)
synchronized
5. synchronized加在静态方法和普通方法区别(来*科技)
同步监视器不同。静态:当前类本身 非静态:this
6. Java中synchronized和ReentrantLock有什么不同(三*重工)
1 | 类似问题: |
1 | synchronized不管是同步代码块还是同步方法,都需要在结束一对{}之后,释放对同步监视器的调用。 |
7. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?(鸿*网络)
需要看其他方法是否使用synchronized修饰,同步监视器的this是否是同一个。
只有当使用了synchronized,且this是同一个的情况下,就不能访问了。
8. 线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?(阿*校招、西安*创佳*)
同步一定阻塞;阻塞不一定同步。
2.5 死锁
1. 什么是死锁,产生死锁的原因及必要条件(腾*、阿*)
1 | 1. 如何看待死锁? |
2. 如何避免死锁?(阿*、北京*蓝、*手)
见上。
2.6 线程通信
1. Java中notify()和notifyAll()有什么区别(汇*天下)
1 | notify():一旦执行此方法,就会唤醒被wait()的线程中优先级最高的那一个线程。(如果被wait()的多个线程的优先级相同,则 |
2. 为什么wait()和notify()方法要在同步块中调用(北京*智)
因为调用者必须是同步监视器。
3. 多线程:生产者,消费者代码(同步、wait、notifly编程)(猫*娱乐)
1 | 类似问题: |
略
4. wait()和sleep()有什么区别?调用这两个函数后,线程状态分别作何改变?(字*、*东)
1 | 类似问题: |
1 | 相同点:一旦执行,当前线程都会进入阻塞状态 |
2.7 单例模式(线程安全)
1. 手写一个单例模式(Singleton),还要安全的(*通快递、君*科技)
饿汉式;安全的懒汉式;内部类;
2. 手写一个懒汉式的单例模式&解决其线程安全问题,并且说明为什么这样子去解决(5*)
1 | 类似问题: |
同上。