Java--这张线程瓜图保熟,不进来看看?这瓜要是不熟它就Dead掉了
先来看一下线程这张图线程的几种运行状态之间运行流程:

看不懂没关系,慢慢来学习,往下学习来继续了解一下~
什么是线程?
线程是进程的一部分,是程序执行中的一条执行路线;

进程就是指程序在其自身地址空间的一次执行活动,是程序独立运行的基本单位;
一个进程可以包含多条线程,一个条线程对应一个进程中的一条执行路线。
线程的几种创建方式?
主要由四种方式创建线程:

方式1:继承Thread类,重写run(),无返回值
方式2:实现Runnable接口,重写run(),无返回值
方式3:新建FutureTask + 实现Callable接口,重写call(),有返回值
方式4:通过Executors工具类创建线程池 + 调用submit + 重写Callable接口,重写call(),有返回值
具体每一种创建方式说明及代码实现如下:
/**
* 创建Thread线程的四种方式之内部类写法
*/
public class NewThread {
public static void main(String[] args) throws Exception {
//方式1
Thread t1 = new Thread(){
@Override
public void run() {
System.out.println("方式1:继承Thread类并重写run()方法创建线程,无返回值");
}
};
t1.start();
Thread.sleep(1000);
//方式2
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("方式2:实现Runnable接口并重写run()方法创建线程,无返回值");
}
});
t2.start();
Thread.sleep(1000);
//方式3
FutureTask<String> ft = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
String result = "方式3:实现Callable接口并重写call()方法新建FutureTask对象作为new Thread实例化参数创建线程,有返回值";
return result;
}
});
Thread t3 = new Thread(ft);
t3.start();
System.out.println(ft.get()); //输出返回值
Thread.sleep(1000);
//方式4
ExecutorService pool = Executors.newFixedThreadPool(5);
Future<String> future = pool.submit(new Callable<String>(){
@Override
public String call() throws Exception {
String result = "方式4:通过工具类Executors创建线程池,调用submit新建Future对象并重写Callable接口重写call()方法创建线程,有返回值";
return result;
}
});
pool.shutdown();//关闭线程池
System.out.println(future.get()); //输出返回值
}
}
线程的几种状态?
新建(new):通过上面介绍的某种方式新建线程即处于新建状态;
就绪(Ready):调用线程的start()方法,首先进入就绪状态,等待获取CPU时间;
运行(Running):就绪状态的线程获取到CPU时间或阻塞状态的线程恢复都可进入运行状态;
阻塞(Blocked):运行状态的线程可能因为IO阻塞或在synchronized同步代码块中都可进入阻塞状态;
死亡(Dead):正常运行的线程执行结束或就绪状态的线程直接调用stop()方法就会进入死亡状态;
睡眠(Sleeping):调用sleep方法指定线程睡眠多久,会释放CPU资源,但不释放锁资源,睡眠时间到后会重新进入就绪状态;
等待(Waiting):调用wait会让线程短暂的处于等待中,会释放CPU资源,并且释放锁资源,进入就绪状态。

线程相关的核心方法及作用?
start:调用start()方法底层源码会判断线程状态是否是新建状态,不是则直接抛异常,并且后续会调用一个native本地方法start0,其底层通过JVM来进行调度最后调用run()方法执行;
run:调用run()方法,底层会直接进入到重写的run()方法并执行代码块内容;
sleep:属于Thread类的一个native本地static静态方法,可以在任何地方调用sleep(1000)方法,期间会让当前线程进入睡眠状态1秒钟,并让出CPU资源,但不释放锁资源
wait:属于Object类的一个方法,只能在synchronized同步块中进行调用wait(1000)方法,期间会让当前线程进入等待状态1秒钟,不仅会让出CPU时间,还释放并释放对象锁资源
yield:跟sleep一样,也是Thread类的一个native本地static静态方法,与sleep的最大区别在于Thread.yield()不需要指定暂停时间,并不会阻塞线程,而是进入就绪状态,短暂的让出CPU资源,这份CPU资源可能自己会再次获取到,这个取决于调度器;
notify:同wait一样,也是属于Object类的一个方法,作用是可以将wait()后等待的线程进行单个唤醒,并进入Read就绪状态;
notifyAll:同notify一样,也是属于Object类的一个方法,作用将当前对象上的所有等待线程唤醒,并进入Read就绪状态;
stop:该方法已被废弃,不建议使用,该方法的作用是直接将线程结束,进入死亡状态;
interrupt:冲断线程,不保证线程进入死亡、就绪还是继续运行,不想stop可以直接冲断一个正在运行的线程。
————————————————
原文链接:https://blog.csdn.net/JustinQin/article/details/120633890
Java--这张线程瓜图保熟,不进来看看?这瓜要是不熟它就Dead掉了的更多相关文章
- 学习Java的9张思维导图
转自:https://blog.csdn.net/aitaozi11/article/details/79652943 网上搜集了java的学习思维导图,分享给大家. 01.Java程序设计(基础) ...
- 一篇文章一张思维导图看懂Android学习最佳路线
一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...
- Java中的线程Thread总结
首先来看一张图,下面这张图很清晰的说明了线程的状态与Thread中的各个方法之间的关系,很经典的! 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口. 要注意的是Threa ...
- Java并发之线程转储
一.java线程转储 java的线程转储可以被定义为JVM中在某一个给定的时刻运行的所有线程的快照.一个线程转储可能包含一个单独的线程或者多个线程.在多线程环境中,比如J2EE应用服务器,将会有许多线 ...
- java命令分析线程死锁以及内存泄漏
一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...
- 小谈Java里的线程
今天,我们来谈一谈Java里的线程. 一.进程与线程的基本概念 大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念.打开电脑的任务管理器,我们就可以看到许多进程.它们主要分为三类, ...
- Java并发之线程管理(线程基础知识)
因为书中涵盖的知识点比较全,所以就以书中的目录来学习和记录.当然,学习书中知识的时候自己的思考和实践是最重要的.说到线程,脑子里大概知道是个什么东西,但很多东西都还是懵懵懂懂,这是最可怕的.所以想着细 ...
- Java多线程之线程的控制
Java多线程之线程的控制 线程中的7 种非常重要的状态: 初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dea ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
随机推荐
- Sublime Text 3结合Chrome实现网页的自动刷新
我们在编写前端代码时,写好一部分代码时想要看一看代码的实现效果,每次都要手动刷新会非常麻烦,神器来了,LiveReload插件实现网页的实时刷新,操作方法如下: 1. 官网下载Sublime Text ...
- <数据结构>XDOJ334.分组统计
问题与解答 问题描述 先输入一组数,然后输入其分组,按照分组统计出现次数并输出,参见样例. 输入格式 输入第一行表示样例数m,对于每个样例,第一行为数的个数n,接下来两行分别有n个数,第一行有n个数, ...
- 涂鸦智能 dubbo-go 亿级流量的实践与探索
涂鸦智能 dubbo-go 亿级流量的实践与探索 dubbo 是一个基于 Java 开发的高性能的轻量级 RPC 框架,dubbo 提供了丰富的服务治理功能和优秀的扩展能力.而 dubbo-go 在 ...
- Linux下设置普通用户使用sudo命令
1.登录root用户 2.增加root用户对文件sudoers的写权限 chmod u+w /etc/sudoers 3.编辑sudoers,把用户mysql添加进去 vi /etc/sudoers ...
- linux的用户主目录(~)指向问题
最近在Ubuntu上安装rabbitmq之后,发现~目录指向出问题了,原本~指向当前shell登录的用户主目录,如下图 现在变成了这样: 登录之后进入的不是~目录,而是直接显示的主目录,而~指向的目录 ...
- rocksdb代码解析-db.h
总 这篇是对rocksdb整体功能的分析,主要着眼点是db.h文件,对rocksdb进行代码解析,若想以整体的方式了解其功能,首先就应该解析db.h文件.对于rocksdb的db.h文件来说,且不论前 ...
- 初识python:多线程
多线程:在一个程序中,独立运行的程序片断叫作"线程"(Thread),利用它编程的概念就叫作"多线程处理".即:一个进程中,多个线程. 举个例说明:就像是一列火 ...
- Flask_路由(二)
一.路由规则设置说明 flask框架使用route()装饰器配置路由. from flask import Flask app = Flask(__name__) @app.route("/ ...
- c# - 关于位移符号 >> 和 << 的使用
1.前言 这是对二进制数据进行位移的方法 2.操作 using System; namespace ConsoleApp1.toValue { public class test1 { public ...
- Linux上天之路(十一)之软件管理
软件包格式: RPM:源码封装后的格式,类似于exe文件 源码:软件源代码,可以修改,优化 1. RPM软件包管理 rpm是一个很有用的包管理器,可以用于生成.安装.查询.核实.更新以及卸载单个软件包 ...