java 多线程状态_总结Java中线程的状态及多线程的实现方式
线程的状态线程状态图:
说明:
线程共包括以下5种状态。
1. 新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。
2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。
3. 运行状态(Running) :线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。
4. 阻塞状态(Blocked) : 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(1) 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。
(2) 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
(3) 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5. 死亡状态(Dead) : 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
这5种状态涉及到的内容包括Object类, Thread和synchronized关键字。这些内容我们会在后面的章节中逐个进行学习。
Object类,定义了wait(), notify(), notifyAll()等休眠/唤醒函数。
Thread类,定义了一些列的线程操作函数。例如,sleep()休眠函数, interrupt()中断函数, getName()获取线程名称等。
synchronized,是关键字;它区分为synchronized代码块和synchronized方法。synchronized的作用是让线程获取对象的同步锁。
在后面详细介绍wait(),notify()等方法时,我们会分析为什么“wait(), notify()等方法要定义在Object类,而不是Thread类中”。
实现多线程的两种方式:Thread和RunnableRunnable 是一个接口,该接口中只包含了一个run()方法。它的定义如下:
public interface Runnable {
public abstract void run();
}
Runnable的作用,实现多线程。我们可以定义一个类A实现Runnable接口;然后,通过new Thread(new A())等方式新建线程。
Thread 是一个类。Thread本身就实现了Runnable接口。它的声明如下:
public class Thread implements Runnable {}
Thread的作用,实现多线程。
Thread和Runnable的异同点:Thread 和 Runnable 的相同点:都是“多线程的实现方式”。
Thread 和 Runnable 的不同点:
Thread 是类,而Runnable是接口;Thread本身是实现了Runnable接口的类。我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。
此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。
通常,建议通过“Runnable”实现多线程!
Thread和Runnable的多线程示例
1.Thread的多线程示例下面通过示例更好的理解Thread和Runnable,借鉴网上一个例子比较具有说服性的例子。// ThreadTest.java 源码
class MyThread extends Thread{
private int ticket=10;
public void run(){
for(int i=0;i<20;i++){
if(this.ticket>0){
System.out.println(this.getName()+" 卖票:ticket"+this.ticket--);
}
}
}
};
public class ThreadTest {
public static void main(String[] args) {
// 启动3个线程t1,t2,t3;每个线程各卖10张票!
MyThread t1=new MyThread();
MyThread t2=new MyThread();
MyThread t3=new MyThread();
t1.start();
t2.start();
t3.start();
}
}
运行结果:
Thread-0 卖票:ticket10
Thread-1 卖票:ticket10
Thread-2 卖票:ticket10
Thread-1 卖票:ticket9
Thread-0 卖票:ticket9
Thread-1 卖票:ticket8
Thread-2 卖票:ticket9
Thread-1 卖票:ticket7
Thread-0 卖票:ticket8
Thread-1 卖票:ticket6
Thread-2 卖票:ticket8
Thread-1 卖票:ticket5
Thread-0 卖票:ticket7
Thread-1 卖票:ticket4
Thread-2 卖票:ticket7
Thread-1 卖票:ticket3
Thread-0 卖票:ticket6
Thread-1 卖票:ticket2
Thread-2 卖票:ticket6
Thread-2 卖票:ticket5
Thread-2 卖票:ticket4
Thread-1 卖票:ticket1
Thread-0 卖票:ticket5
Thread-2 卖票:ticket3
Thread-0 卖票:ticket4
Thread-2 卖票:ticket2
Thread-0 卖票:ticket3
Thread-2 卖票:ticket1
Thread-0 卖票:ticket2
Thread-0 卖票:ticket1
结果说明:
(1) MyThread继承于Thread,它是自定义个线程。每个MyThread都会卖出10张票。
(2) 主线程main创建并启动3个MyThread子线程。每个子线程都各自卖出了10张票。
2.Runnable的多线程示例下面,我们对上面的程序进行修改。通过Runnable实现一个接口,从而实现多线程。
// RunnableTest.java 源码
class MyThread implements Runnable{
private int ticket=10;
public void run(){
for(int i=0;i<20;i++){
if(this.ticket>0){
System.out.println(Thread.currentThread().getName()+" 卖票:ticket"+this.ticket--);
}
}
}
};
public class RunnableTest {
public static void main(String[] args) {
MyThread mt=new MyThread();
// 启动3个线程t1,t2,t3(它们共用一个Runnable对象),这3个线程一共卖10张票!
Thread t1=new Thread(mt);
Thread t2=new Thread(mt);
Thread t3=new Thread(mt);
t1.start();
t2.start();
t3.start();
}
}
运行结果:
Thread-0 卖票:ticket10
Thread-2 卖票:ticket8
Thread-1 卖票:ticket9
Thread-2 卖票:ticket6
Thread-0 卖票:ticket7
Thread-2 卖票:ticket4
Thread-1 卖票:ticket5
Thread-2 卖票:ticket2
Thread-0 卖票:ticket3
Thread-1 卖票:ticket1
结果说明:
(1) 和上面“MyThread继承于Thread”不同;这里的MyThread实现了Thread接口。
(2) 主线程main创建并启动3个子线程,而且这3个子线程都是基于“mt这个Runnable对象”而创建的。运行结果是这3个子线程一共卖出了10张票。这说明它们是共享了MyThread接口的。
java 多线程状态_总结Java中线程的状态及多线程的实现方式相关推荐
- java怎么修改订单状态_在WooCommerce中自定义订单状态更改时发送电子邮件通知
我在我的WooCommerce中创建了一个名为Back Order( wc-backorder )的自定义订单状态: /** * Add custom status to order list */ ...
- Java中线程的状态
Java中线程的状态 操作系统中线程的状态 Java中线程的状态 线程状态枚举类 操作系统中线程的状态 从操作系统层面来看,线程通常有以下五种状态,前三种是线程的基本状态. [运行态]:进程正处在处理 ...
- java中线程的状态以及线程栈分析
java中线程的状态 状态 说明 NEW 初始状态.线程刚刚被创建,并且start()方法还未被调用 RUNNABLE 运行状态.表示线程正在java虚拟机中执行,但是可能正在等待操作系统的其他资源, ...
- java 线程状态_浅析Java中的线程状态
一.线程的5种状态 众所周知,Java的线程状态有5种,分别对应上图中五种不同颜色,下面对这5种状态及状态间的转化做相应的解释: 1. 初始化状态:新建一个线程对象 2. 可运行状态:其他线程调用了该 ...
- java 线程池 状态_【Java多线程】线程状态、线程池状态
线程状态: 线程共包括以下5种状态. 1. 新建状态(New)线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪状态(Runnable)也 ...
- 并发基础篇(四): java中线程的状态深入浅出
一.线程的五种状态 线程的生命周期可以大致分为5种,但这种说法是比较旧的一种说法,有点过时了,或者更确切的来说,这是操作系统的说法,而不是java的说法.但对下面所说的六种状态的理解有所帮助,所以 ...
- Java线程池中线程的状态简介
2019独角兽企业重金招聘Python工程师标准>>> 首先明确一下线程在JVM中的各个状态(JavaCore文件中) 1.死锁,Deadlock(重点关注) 2.执行中,Runna ...
- Java中线程的状态。
线程的状态:一个线程只能有一次NEW状态,和TERMINATED状态 NEW(新建状态):创建后,启动前.线程就处于该状态 RUNNABLE(可运行状态):线程正在执行 ...
- 多线程的实现方式_Java中线程的状态及多线程的实现方式
线程的状态 线程状态图: 说明: 线程共包括以下5种状态.1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状 ...
最新文章
- 根据传入坐标和图片URL地址对图片进行切图操作、将图片转化成Base64位码
- 拜托,别问我什么各种Tree了,干就完事!
- Linq入门博客系列地址http://www.cnblogs.com/lifepoem/category/330218.html
- TF:利用是Softmax回归+GD算法实现MNIST手写数字图片识别(10000张图片测试得到的准确率为92%)
- 精益软件开发简介之A版
- 5M1E,软件质量管理最佳解决方案
- log4j:WARN Please initialize the log4j system properly
- 用计算机进行有理数除法时,有理数的乘除法怎么算?,什么是有理数的乘除法。越详细越好。...
- Java 输出链表的第一个和最后一个元素
- Bean的作用域scope
- python监听键盘输入_Python监听鼠标键盘事件
- Spring使用json转换工具
- 基于SpringBoot的在线问卷调查管理系统
- 第一篇,怎么增加SYN数据包的大小(syn flood攻击实验)
- word 插入脚注尾注和删除页眉页脚
- matlab极坐标画椭圆,matlab怎么画极坐标
- php去掉字符串带逗号前面的字符,php 怎么去掉字符串最后一个逗号
- 相亲与恋爱套路不一样:相亲有哪些需要注意的?
- Appium+python自动化(二十三)- 真假美猴王Monkeyrunner与Monkey傻傻的分不清楚(超详解)...
- 【徒手训练】来自美国特种部队的徒手三角肌训练法
热门文章
- accessdeniedexception: 不允许访问_一招解决JDK9以上非法反射访问警告
- 新时代大视频产业的底座,视频云创变了什么?
- 2021中国互联网大会正式发布阿里云《云采用框架白皮书》
- 如何利用云原生技术构建现代化应用
- 投稿 | “轻量应用服务器”征文活动正式启动
- “数据驱动”时代来临,阿里云数据中台如何赋能金融业?(附重磅报告下载)
- 孤尽独家解读《Java开发手册》,速来预约!
- 从技术角度聊聊,短视频为何让人停不下来?
- c oracle time,在C/C++中添加1个月到time_t的简单方法
- mysql还原数据mysqldump