JAVA面经-基础篇-线程
1、创建线程有哪几种方式?
创建线程有3种方式,分别是继承Thread类、实现Runnable类、实现Callable类。
继承Thread类的步骤:
1. 定义Thread类的子类,并重写run()方法,该run方法将作为线程执行体;
2. 创建线程对象,即Thread子类的实例;
3. 调用线程对象的start()方法启动该线程。
实现Runnable类的步骤:
1. 定义Runnable接口的实现类,并实现该接口的run()方法,该方法将作为线程执行体;
2. 创建Runnable实现类的实例,并将其作为Thread的target来创建Thread对象,Thread作为线程对象;
3. 调用线程对象的start()方法启动该线程。
实现Callable类的步骤:
1. 定义Callable接口的实现类,并实现该接口的call()方法,该方法将作为线程执行体,且该call()方法有返回值,再创建Callable实现类类的实例;
2. 使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()的返回值;
3. 使用FutureTask对象作为Thread对象的target创建并启动新线程;
4. 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。
- 线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。
- 在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
- 劣势是,编程稍稍复杂,如果需要访问当前线程,则必须使用Thread.currentThread()方法。
- 劣势是,因为线程类已经继承了Thread类,所以不能再继承其他父类。
- 优势是,编写简单,如果需要访问当前线程,则无须使用Thread.currentThread()方法,直接使用this即可获得当前线程。
2、Thread类的常用方法
- Thread()
- Thread(String name)
- Thread(Runnable target)
- Thread(Runnable target, String name)
- currentThread():返回当前正在执行的线程;
- interrupted():返回当前执行的线程是否已经被中断;
- sleep(long millis):使当前执行的线程睡眠多少毫秒数;
- yield():使当前执行的线程自愿暂时放弃对处理器的使用权并允许其他线程执行;
- getId():返回该线程的id;
- getName():返回该线程的名字;
- getPriority():返回该线程的优先级;
- interrupt():使该线程中断;
- isInterrupted():返回该线程是否被中断;
- isAlive():返回该线程是否处于活动状态;
- isDaemon():返回该线程是否是守护线程;
- setDaemon(boolean on):将该线程标记为守护线程或用户线程,如果不标记默认是非守护线程;
- setName(String name):设置该线程的名字;
- setPriority(int newPriority):改变该线程的优先级;
- join():等待该线程终止;
- join(long millis):等待该线程终止,至多等待多少毫秒数。
3、run()和start()有什么区别
run()方法被称为线程执行体,它的方法体代表了线程需要完成的任务,而start()方法用来启动线程。

JAVA面经-基础篇-线程的更多相关文章
- Java多线程系列--“基础篇”05之 线程等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- Java多线程系列--“基础篇”06之 线程让步
概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...
- Java多线程系列--“基础篇”07之 线程休眠
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
- Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...
- Java多线程系列--“基础篇”11之 生产消费者问题
概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...
- Java多线程系列--“基础篇”04之 synchronized关键字
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...
- Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答.本章内容包括:start() 和 run()的区别说明start() 和 run()的区别示例start( ...
- Java多线程系列--“基础篇”08之 join()
概要 本章,会对Thread中join()方法进行介绍.涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_40)3. join()示例 转载请注明出处:http ...
随机推荐
- ORM框架的延迟加载(懒加载)
Hibernate的延迟加载分类的延迟加载和集合的延迟加载,类的延迟加载又分调用session的load()方法的延迟加载和加载实体单向关联的另一个实体的延迟加载 1.修改配置文件 spring.jp ...
- git lock fail解决
本地多个分支,remote .remote tracking.local checkout了2个不同版本分支,发现最后版本却是相同的,然后pull时报git lock fail, 看来发送了冲突了,删 ...
- VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory.
macOS VirtualBox Bridged Adapter 不能用 I'm running macOS High Sierra 10.13.1 and VirtualBox 5.2.2. Thi ...
- docker的使用以及常用命令
查看docker镜像仓库中是否存在某个镜像,通常第一个或stars最多的就是我们要是使用的,以nginx为例 # 搜索一下是否存在该镜像文件 docker search nginx # 安装使用该镜像 ...
- bottle库上传文件
安装bottle库 pip install bottle 上传代码 import bottle @bottle.get('/upload') def upload_get(): return bott ...
- 更换CentOS的下载源为阿里云
阿里Linux镜像地址:http://mirrors.aliyun.com/ 1.备份mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cen ...
- python实现自动打卡
自己也百度了一下,然后写的,分为了三个部分,见三段代码 代码:主程序代码 import timefrom selenium import webdriverfrom private_info impo ...
- docker实战(8)使用docker-compose快速搭建zookeeper集群
镜像下载 docker pull zookeeper 复制 zookeeper 集群的搭建 创建名为docker-compose.yml的文件 输入以下内容 version: '2' services ...
- Java数组之冒泡排序【重点】
冒泡排序 冒泡排序是最为出名的排序算法之一,总共有八大排序! 冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层依次比较. 我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为O(n2). ...
- Unity 消息机制
最近有新项目需要和同事合作开发,他做UI 我做网络层,做着做着发现 如果我们要相对独立完成自己的开发任务,那我们的代码耦合得减少,不然 一个人代码有大改的时候,另一个人也要进行大幅修改,这样不便于后期 ...