Java 多线程快速入门

  • 什么是进程,什么是线程,什么是多线程?
  • 创建多线程有哪些方式?
  • 启动线程是使用调用start方法还是run方法?
  • 获取线程对象以及名称
  • 守护线程
    • 使用setDaemon(true)方法设置为守护线程
  • 多线程运行状态
    • 新建状态
    • 就绪状态
    • 运行状态
    • 阻塞状态
    • 死亡状态
  • join()方法的作用?
  • 优先级
  • Thread.yield()方法

什么是进程,什么是线程,什么是多线程?

进程: 进程就是正在运行的应用程序,进程是线程的集合
线程: 线程就是一条执行路径,一个独立的执行单元
多线程: 多线程就是为了提高程序效率

创建多线程有哪些方式?

  1. 使用继承Thread类方式,继承Thread类重写run方法
  2. 使用实现runnable接口方式
  3. 使用匿名内部类方式
  4. 使用jdk并发包里的callable方式
  5. 使用线程池创建线程方式

启动线程是使用调用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()方法.

阻塞状态

线程运行过程中,可能由于各种原因进入阻塞状态

  1. 线程通过调用sleep方法进入睡眠状态;
  2. 线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
  3. 线程试图得到一个锁,而该锁正被其他线程持有(也就是线程死锁);
  4. 线程在等待某个触发条件;

死亡状态

有两个原因会导致线程死亡:

  1. run()方法正常退出而自然死亡;
  2. 一个未捕获的异常终止了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 多线程快速入门(面试概念解答一)相关推荐

  1. Java 高级 --- 多线程快速入门

    这世上有三样东西是别人抢不走的:一是吃进胃里的食物,二是藏在心中的梦想,三是读进大脑的书 多线程快速入门 1.线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组 ...

  2. java web快速入门_Web安全快速入门

    java web快速入门 Web开发人员针对CORS,CSP,HSTS和所有Web安全首字母缩写词的入门知识! (A web developer's primer on CORS, CSP, HSTS ...

  3. 速看,月薪60K的技术专家总结Java的快速入门.

    作为刚刚接触Java的小白来说,最担心的应该就是Java怎么学,都需要掌握哪些内容?今天这篇文章希望能帮助大家快速入门Java,少走弯路! 如何快速入门Java? 一.作为刚接触Java的新手,肯定要 ...

  4. Java如何快速入门?Java初学者从入门到精通必看!

            作为刚刚接触Java的小白来说,最担心的应该就是Java怎么学,都需要掌握哪些内容?今天这篇文章希望能帮助大家快速入门Java,少走弯路! 如何快速入门Java? 一.作为刚接触Jav ...

  5. JAVA多线程和并发面试问题

    转载自   JAVA多线程和并发面试问题 Java多线程面试问题 1.进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程 ...

  6. JAVA程序设计-头歌实训-------# 第一阶段 Java语言快速入门

    第一阶段 Java语言快速入门 第1关:Java程序的基本框架:Hello Java World! 任务描述 本关的任务是编写你人生中第一个Java程序,从此开启你的Java实训之旅,显示效果如下: ...

  7. JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署...

    接上篇<JAVA WEB快速入门之环境搭建>,在完成了环境搭建后(JDK.Tomcat.IDE),现在是万事具备,就差写代码了,今天就来从编写一个JSP WEB网站了解JSP WEB网站的 ...

  8. C++多线程快速入门(五)简单线程池设计

    目录 设计思路 主线程运行逻辑 task以及taskpool设计 详细流程讲解 完整代码 打印结果 往期回顾 设计思路 线程池实际上就是一组线程,当我们需要异步执行一些任务时,经常要通过OS频繁创建和 ...

  9. C++多线程快速入门(三):生产者消费者模型与条件变量使用

    互斥锁完成 #include <iostream> #include <deque> #include <thread> #include <mutex> ...

最新文章

  1. oracle10g提权,Oracle 10g提权测试
  2. 打包python程序
  3. python的6种基本数据类型--字典
  4. AI数学基础之:确定图灵机和非确定图灵机
  5. Docker最全教程——从理论到实战(七)
  6. NeurIPS’20 | 长尾问题太严重?半监督和自监督就可以有效缓解!
  7. Windows7 Xp Mode部署与讲解
  8. 关于docker的几个问题
  9. 学软件测试看什么书籍推荐?
  10. 如何像在SQL中一样使用#39;in#39;和#39;not in#39;过滤Pandas数据帧
  11. ffmpeg文档8:软件缩放
  12. 全国自然保护区生态功能区分布数据
  13. 人工智能产品经理工作流程
  14. 海康球机3D定位功能编码实现VC(对前一篇补充改进)
  15. 计算机内存槽清理,内存插槽修复方法
  16. python变白_Python OpenCV纯白色背景
  17. 2012,当我们谈论移动互联网创业时,我们在谈论些什么?
  18. Cesium-Camera-flyto详解
  19. 百度云不限速-proxyee-down
  20. 基于java的幼儿园早教网站

热门文章

  1. 用pyquery5行代码爬取百度热点新闻
  2. 后台管理系统[01第三方库集成]
  3. 工业物联网RTU与DTU的区别
  4. 小傻蛋的妹妹跟随小甲鱼学习Python的第八节008
  5. 北大java面试,北大青鸟java 面试--常见面试题(下)
  6. 程序化自动生成视频实现Youtube掘金
  7. Andorid11系统自带Dialer不是默认应用
  8. 《道德经》| 夫唯不盈,故能蔽而新成
  9. 小程序 键盘挡住底部输入框解析
  10. python随机抽取5张扑克牌,判断是否为顺子