线程的状态线程状态图:

说明:

线程共包括以下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中线程的状态及多线程的实现方式相关推荐

  1. java怎么修改订单状态_在WooCommerce中自定义订单状态更改时发送电子邮件通知

    我在我的WooCommerce中创建了一个名为Back Order( wc-backorder )的自定义订单状态: /** * Add custom status to order list */ ...

  2. Java中线程的状态

    Java中线程的状态 操作系统中线程的状态 Java中线程的状态 线程状态枚举类 操作系统中线程的状态 从操作系统层面来看,线程通常有以下五种状态,前三种是线程的基本状态. [运行态]:进程正处在处理 ...

  3. java中线程的状态以及线程栈分析

    java中线程的状态 状态 说明 NEW 初始状态.线程刚刚被创建,并且start()方法还未被调用 RUNNABLE 运行状态.表示线程正在java虚拟机中执行,但是可能正在等待操作系统的其他资源, ...

  4. java 线程状态_浅析Java中的线程状态

    一.线程的5种状态 众所周知,Java的线程状态有5种,分别对应上图中五种不同颜色,下面对这5种状态及状态间的转化做相应的解释: 1. 初始化状态:新建一个线程对象 2. 可运行状态:其他线程调用了该 ...

  5. java 线程池 状态_【Java多线程】线程状态、线程池状态

    线程状态: 线程共包括以下5种状态. 1. 新建状态(New)线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪状态(Runnable)也 ...

  6. 并发基础篇(四): java中线程的状态深入浅出

    一.线程的五种状态   线程的生命周期可以大致分为5种,但这种说法是比较旧的一种说法,有点过时了,或者更确切的来说,这是操作系统的说法,而不是java的说法.但对下面所说的六种状态的理解有所帮助,所以 ...

  7. Java线程池中线程的状态简介

    2019独角兽企业重金招聘Python工程师标准>>> 首先明确一下线程在JVM中的各个状态(JavaCore文件中) 1.死锁,Deadlock(重点关注) 2.执行中,Runna ...

  8. Java中线程的状态。

    线程的状态:一个线程只能有一次NEW状态,和TERMINATED状态         NEW(新建状态):创建后,启动前.线程就处于该状态         RUNNABLE(可运行状态):线程正在执行 ...

  9. 多线程的实现方式_Java中线程的状态及多线程的实现方式

    线程的状态 线程状态图: 说明: 线程共包括以下5种状态.1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状 ...

最新文章

  1. 根据传入坐标和图片URL地址对图片进行切图操作、将图片转化成Base64位码
  2. 拜托,别问我什么各种Tree了,干就完事!
  3. Linq入门博客系列地址http://www.cnblogs.com/lifepoem/category/330218.html
  4. TF:利用是Softmax回归+GD算法实现MNIST手写数字图片识别(10000张图片测试得到的准确率为92%)
  5. 精益软件开发简介之A版
  6. 5M1E,软件质量管理最佳解决方案
  7. log4j:WARN Please initialize the log4j system properly
  8. 用计算机进行有理数除法时,有理数的乘除法怎么算?,什么是有理数的乘除法。越详细越好。...
  9. Java 输出链表的第一个和最后一个元素
  10. Bean的作用域scope
  11. python监听键盘输入_Python监听鼠标键盘事件
  12. Spring使用json转换工具
  13. 基于SpringBoot的在线问卷调查管理系统
  14. 第一篇,怎么增加SYN数据包的大小(syn flood攻击实验)
  15. word 插入脚注尾注和删除页眉页脚
  16. matlab极坐标画椭圆,matlab怎么画极坐标
  17. php去掉字符串带逗号前面的字符,php 怎么去掉字符串最后一个逗号
  18. 相亲与恋爱套路不一样:相亲有哪些需要注意的?
  19. Appium+python自动化(二十三)- 真假美猴王Monkeyrunner与Monkey傻傻的分不清楚(超详解)...
  20. 【徒手训练】来自美国特种部队的徒手三角肌训练法

热门文章

  1. accessdeniedexception: 不允许访问_一招解决JDK9以上非法反射访问警告
  2. 新时代大视频产业的底座,视频云创变了什么?
  3. 2021中国互联网大会正式发布阿里云《云采用框架白皮书》
  4. 如何利用云原生技术构建现代化应用
  5. 投稿 | “轻量应用服务器”征文活动正式启动
  6. “数据驱动”时代来临,阿里云数据中台如何赋能金融业?(附重磅报告下载)
  7. 孤尽独家解读《Java开发手册》,速来预约!
  8. 从技术角度聊聊,短视频为何让人停不下来?
  9. c oracle time,在C/C++中添加1个月到time_t的简单方法
  10. mysql还原数据mysqldump