线程:CPU调度的最小单位;线程共享堆内存和方法区,但各自享有栈空间。进程:CPU分配资源的最小单位。

为什么需要多线程:①避免其中一个模块阻塞造成系统假死;②程序异步处理(交替执行),提高程序执行效率。

1. 创建线程

1.1 创建线程主要有三种方式,第一种就是创建一个类,该类继承Thread类并覆盖Thread类的run方法。

1.2 启动线程及运行结果

1.3 创建线程的第二种方式,就是调用Thread构造方法时传入Runnable接口的实现类对象,Runnable接口实现类定义如下。

1.4 启动线程及运行结果

1.5 创建线程的第三种方式,创建一个Callable接口的实现类,然后将该实现类对象作为参数放入FutureTask类的构造方法中,最终将FutureTask对象作为参数放入Thread类的构造方法中,叙述有点繁琐,代码如下。

1.6 启动线程及运行结果

1.7 虽然FutureTask类的对象可以作为Thread构造方法参数,但是我们发现Thread的构造方法中,并没有FutureTask类对象作为参数的构造方法,如下图。

那我们看看FutureTask源码,如下图,FutureTask实现了RunnableFuture接口。

而RunnableFuture接口继承了Runnable接口并继承了run()方法。

1.8 所以,虽然有三种方式实现线程,但是最终实现线程的本质就只是两种方式,一种是继承Thread类,另一种就是Runnable接口的实现类对象。一般使用第二种方式实现线程,因为一个类如果直接继承Thread类,那么就无法继承其它类了;而一个类如果实现Runnable接口,仍然可以继承其它类或实现其它接口,更灵活。但是实现Runnable接口的类,有时候不是很方便。比如Runnable  r = new MyRunnable(); Thread t = new Thread(r);此时我们是无法提供线程对象 t 得到Runnable实现类对象 r 的。

1.9 创建线程的匿名内部类形式,如下图。

2. 线程的五个生命周期

new了一个线程对象,则进入新建状态;执行start()方法后,进入可运行状态(又称就绪状态),表示当前线程具有抢夺cpu时间片的能力,当线程抢夺到CPU时间片,会执行run方法;run方法的执行标志着线程进入运行状态,当之前占有的CPU时间片用完后,会重新回到就绪状态抢夺CPU时间片,run方法执行结束则进入死亡状态;如果遇到阻塞事件(如接收用户输入,sleep方法,join方法),则进入阻塞状态。干讲还是有点繁琐,下面通过一幅图来整理说明。

3. 主线程

3.1 我们java程序一启动,JVM就会创建一个主线程。下图显示两个线程,它们是main主线程(去执行main方法)和Monitor Ctrl-Break后台监控线程(IDEA开发环境创建的一个线程),后台线程可通过setDaemon(true)来设定,如网络连接(主线程)和心跳包发送(守护线程,主线程断开连接,那么不需要再发送心跳包)。

3.2 如果分支线程有main方法,会不会变为主线程?测试代码和运行结果及分析如下图。

public class ThreadMainTest {public static void main(String[] args){MyThread mt = new MyThread();mt.start();for (int i = 0; i < 10; i++) {System.out.println("主线程: " + i);}}
}
class MyThread extends Thread{public static void main(String[] args) {for (int i = 0; i < 10; i++) {System.out.println(" 分支线程的main方法: " + i);}}@Overridepublic void run() {main(new String[]{});for (int i = 0; i < 10; i++) {System.out.println(super.getName() + " 分支线程的run方法: " + i);}}
}

4. 终止线程

4.1 第一种,通过设定一个布尔型的标志位成员变量,来决定是否结束线程,如下图。

4.2 自己设定一个异常,当发生异常时,结束线程,这边以InterruptedException为例,如下图。

5. 死锁

5.1 死锁怎么产生的?多个线程互相等待对方资源,得到资源前,不会释放自己已有的资源,出现了循环等待的现象。

5.2 怎么避免死锁?①系统安全状态判断法:在分配系统资源前,判断此次资源分配的安全性。②银行家算法:不也是通过系统安全判定算法来实现吗?当系统剩余的资源满足所需求的资源,说明已分配的资源可以收回来。

5.3 发生死锁怎么处理?①操作系统将该线程挂起,并抢占该线程资源;②操作系统强制撤销线程并剥夺资源;③线程回退,将线程回退至系统安全状态。

详解java中Thread类,线程和进程的基本区别,多线程的好处,线程的五个生命周期,主线程和IDEA创建的Monitor Ctrl-Break守护线程;优雅地终止线程。死锁的产生相关推荐

  1. java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题

    先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...

  2. java sleep唤醒_详解Java中的线程让步yield()与线程休眠sleep()方法

    Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法 线程让步: ...

  3. 【视频】详解Scala中的类及与Java的详细区别

    详解Scala中的类及与Java的详细区别

  4. php中继承过来的类初始化顺序,java_图文详解Java中class的初始化顺序,class的装载 在讲class的初始化 - phpStudy...

    图文详解Java中class的初始化顺序 class的装载 在讲class的初始化之前,我们来讲解下class的装载顺序. 以下摘自<Thinking in Java 4> 由于Java ...

  5. java ftp ftpclient_详解JAVA中使用FTPClient工具类上传下载

    详解JAVA中使用FTPClient工具类上传下载 在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件.本文简单介绍如何利用jakarta commons中的FTPClie ...

  6. java object数组转实体类_详解Java中String JSONObject JSONArray List实体类转换

    JSON使用阿里的fastJson为依赖包 gradle依赖管理如下: compile group: "com.alibaba", name: "fastjson&quo ...

  7. java lock unlock_详解Java中的ReentrantLock锁

    ReentrantLock锁 ReentrantLock是Java中常用的锁,属于乐观锁类型,多线程并发情况下.能保证共享数据安全性,线程间有序性 ReentrantLock通过原子操作和阻塞实现锁原 ...

  8. java system sleep_详解Java中的sleep()和wait()的区别

    详解Java中的sleep()和wait()的区别 对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序 ...

  9. java runnable 异常_详解Java中多线程异常捕获Runnable的实现

    详解Java中多线程异常捕获Runnable的实现 1.背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常.所以要实现主线程对子线程异常的捕获. 2.工具: 实现Runnable接口 ...

最新文章

  1. java使用线程求素数和1000个0~0.9随机数_求素数(多线程练习题)
  2. 12-赵志勇机器学习-Label_Propagation
  3. java intbyreference_java并发包(1)-AtomicReference和AtomicStampedReference
  4. ssh公钥免密码登录
  5. C++ 深浅拷贝 01
  6. 织梦php网站修改教程,织梦DEDEcms织梦软件模型增加图集功能教程(含修改文件下载)...
  7. 从零开始刷Leetcode——数组(11.15.16.18)
  8. pp助手苹果版本_腾讯桌球安卓和苹果系统如何进28以及怎么解决没有金币时的烦恼...
  9. matlab语音信号生成语谱图,基于MATLAB的语音信号采集和语谱图分析
  10. ZOJ3551 Bloodsucker(概率dp)
  11. codeforces 868C - Qualification Rounds
  12. 移远BC28_opencpu方案_pin脚分配
  13. mysql 规则引擎_为什么使用规则引擎?
  14. 教你win7下如何删除微软拼音输入法~!
  15. frameset框架属性
  16. [linux] linux shuf 和 mac gshuf
  17. web自动化测试笔记
  18. 给理工男女的一个神奇网站!
  19. 闲鱼前端技术体系的背后——魔鱼(良心推荐,从思路到实践)
  20. 3.六大原则例子-- 依赖倒置原则(DIP)例子

热门文章

  1. PM——【1】维护功能位置主数据
  2. 【重复制造精讲】REM Pull List 拉料单(续)
  3. SAP 主生产计划(MPS)
  4. 释疑の采购Invoice常用参数设置
  5. windows不能改密码
  6. SAP 用户权限解析
  7. SAP方丈-写给新手的SAP成本核算流程
  8. 与小熊、新宝不同的北鼎,仍不是小家电的出路
  9. 保险运用计算机的工作干什么,关于计算机在保险业务中的应用研究
  10. mysql root 提权_mysql以ROOT权限提权方法