Java 多线程快速入门(面试概念解答一)
Java 多线程快速入门
- 什么是进程,什么是线程,什么是多线程?
- 创建多线程有哪些方式?
- 启动线程是使用调用start方法还是run方法?
- 获取线程对象以及名称
- 守护线程
- 使用setDaemon(true)方法设置为守护线程
- 多线程运行状态
- 新建状态
- 就绪状态
- 运行状态
- 阻塞状态
- 死亡状态
- join()方法的作用?
- 优先级
- Thread.yield()方法
什么是进程,什么是线程,什么是多线程?
进程: 进程就是正在运行的应用程序,进程是线程的集合
线程: 线程就是一条执行路径,一个独立的执行单元
多线程: 多线程就是为了提高程序效率
创建多线程有哪些方式?
- 使用继承Thread类方式,继承Thread类重写run方法
- 使用实现runnable接口方式
- 使用匿名内部类方式
- 使用jdk并发包里的callable方式
- 使用线程池创建线程方式
启动线程是使用调用start方法还是run方法?
开始执行线程 注意 开启线程不是调用run方法,而是start方法
获取线程对象以及名称
常用线程api方法
方法 | 说明 |
---|---|
start() | 启动线程 |
currentThread() | 获取当前线程对象 |
getID() | 获取当前线程ID——Thread-编号(该编号从0开始) |
getName() | 获取当前线程名称 |
sleep() | 休眠线程 |
stop() | 停止线程 |
常用线程构造函数
方法 | 说明 |
---|---|
Thread() | 分配一个新的Thread对象 |
Thread(String name) | 分配一个新的 Thread对象,具有指定的 name正如其名 |
Thread(Runnable runnable) | 分配一个新的 Thread对象 |
Thread(Runnable runnable, String name) | 分配一个新的 Thread对象 |
守护线程
Java中有两种线程,一种是用户线程,另一种是守护线程
**用户线程:**指用户自定义创建的线程,主线程停止,用户线程不会停止
**守护线程:**当进程不存在或主线程停止,守护线程也会被停止
使用setDaemon(true)方法设置为守护线程
public class DaemonThread {public static void main(String[] args) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(100);} catch (Exception e) {// TODO: handle exception}System.out.println("我是子线程...");}}});thread.setDaemon(true);thread.start();for (int i = 0; i < 10; i++) {try {Thread.sleep(100);} catch (Exception e) {}System.out.println("我是主线程");}System.out.println("主线程执行完毕!");}}
多线程运行状态
线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。
新建状态
当用new操作符创建一个线程时,例如new Thread(),线程还没有开始运行,此时线程处在新建状态。
当一个线程处于新生状态时,程序还没有开始运行线程中的代码。
就绪状态
一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。
处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。因为在单CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度程序(thread scheduler)来调度的。
运行状态
当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法.
阻塞状态
线程运行过程中,可能由于各种原因进入阻塞状态
- 线程通过调用sleep方法进入睡眠状态;
- 线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
- 线程试图得到一个锁,而该锁正被其他线程持有(也就是线程死锁);
- 线程在等待某个触发条件;
死亡状态
有两个原因会导致线程死亡:
- run()方法正常退出而自然死亡;
- 一个未捕获的异常终止了run()方法而使线程猝死。
为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false.
join()方法的作用?
join()作用是让其他线程变为等待
t1.join();// 让其他线程变为等待,直到当前t1线程执行完毕,才释放。
thread.join()把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
优先级
现代操作系统基本采用时分的形式调度运行的线程,线程分配得到的时间片的多少决定了线程使用处理器资源的多少,也对应了线程优先级这个概念。在JAVA线程中,通过一个 int priority 来控制优先级,范围为1-10,其中10最高,默认为5。
Thread.yield()方法
Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程。(可能没用效果)
yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会。因此,使用yield()的目的时让具有相同优先级的线程之间能够适当的轮换执行。但是,实际中无法保证yield()达到让步的目的,因为,让步的线程可能被线程调度程序再次选中。
结论:大多数情况下,yield()讲导致线程从运行状态转到可执行状态,但有可能没有效果。
Java 多线程快速入门(面试概念解答一)相关推荐
- Java 高级 --- 多线程快速入门
这世上有三样东西是别人抢不走的:一是吃进胃里的食物,二是藏在心中的梦想,三是读进大脑的书 多线程快速入门 1.线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组 ...
- java web快速入门_Web安全快速入门
java web快速入门 Web开发人员针对CORS,CSP,HSTS和所有Web安全首字母缩写词的入门知识! (A web developer's primer on CORS, CSP, HSTS ...
- 速看,月薪60K的技术专家总结Java的快速入门.
作为刚刚接触Java的小白来说,最担心的应该就是Java怎么学,都需要掌握哪些内容?今天这篇文章希望能帮助大家快速入门Java,少走弯路! 如何快速入门Java? 一.作为刚接触Java的新手,肯定要 ...
- Java如何快速入门?Java初学者从入门到精通必看!
作为刚刚接触Java的小白来说,最担心的应该就是Java怎么学,都需要掌握哪些内容?今天这篇文章希望能帮助大家快速入门Java,少走弯路! 如何快速入门Java? 一.作为刚接触Jav ...
- JAVA多线程和并发面试问题
转载自 JAVA多线程和并发面试问题 Java多线程面试问题 1.进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程 ...
- JAVA程序设计-头歌实训-------# 第一阶段 Java语言快速入门
第一阶段 Java语言快速入门 第1关:Java程序的基本框架:Hello Java World! 任务描述 本关的任务是编写你人生中第一个Java程序,从此开启你的Java实训之旅,显示效果如下: ...
- JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署...
接上篇<JAVA WEB快速入门之环境搭建>,在完成了环境搭建后(JDK.Tomcat.IDE),现在是万事具备,就差写代码了,今天就来从编写一个JSP WEB网站了解JSP WEB网站的 ...
- C++多线程快速入门(五)简单线程池设计
目录 设计思路 主线程运行逻辑 task以及taskpool设计 详细流程讲解 完整代码 打印结果 往期回顾 设计思路 线程池实际上就是一组线程,当我们需要异步执行一些任务时,经常要通过OS频繁创建和 ...
- C++多线程快速入门(三):生产者消费者模型与条件变量使用
互斥锁完成 #include <iostream> #include <deque> #include <thread> #include <mutex> ...
最新文章
- oracle10g提权,Oracle 10g提权测试
- 打包python程序
- python的6种基本数据类型--字典
- AI数学基础之:确定图灵机和非确定图灵机
- Docker最全教程——从理论到实战(七)
- NeurIPS’20 | 长尾问题太严重?半监督和自监督就可以有效缓解!
- Windows7 Xp Mode部署与讲解
- 关于docker的几个问题
- 学软件测试看什么书籍推荐?
- 如何像在SQL中一样使用#39;in#39;和#39;not in#39;过滤Pandas数据帧
- ffmpeg文档8:软件缩放
- 全国自然保护区生态功能区分布数据
- 人工智能产品经理工作流程
- 海康球机3D定位功能编码实现VC(对前一篇补充改进)
- 计算机内存槽清理,内存插槽修复方法
- python变白_Python OpenCV纯白色背景
- 2012,当我们谈论移动互联网创业时,我们在谈论些什么?
- Cesium-Camera-flyto详解
- 百度云不限速-proxyee-down
- 基于java的幼儿园早教网站