文档章节

1-线程的实现与状态

zxlc
 zxlc
发布于 2017/04/25 15:04
字数 1067
阅读 11
收藏 0

进程与线程

进程:是程序的一次执行过程,从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最后消亡的过程。 一个进程就代表一个程序,操作系统能运行多个同时进程。多进程是实现并发的一种有效手段。

线程:线程和进程一样,都是实现并发的一个基本单位。线程是在进程的基础上进行的进一步的划分。多线程是说一个进程在执行过程中可以产生多个线程,这些线程可以同时存在、同在运行

Java中线程的实现

第一种:继承Thread类,重写run()方法

此方法为线程的主体, 要开启线程需要调用start()方法,而不能直接调用run()方法,若直接调用run()方法不会开启线程,仍然是在单线程里执行。

为什么启动线程不能直接使用run()方法呢? 因为线程的运行需要本机操作系统的支持。下面为start()方法在Thread类中的定义:

public synchronized void start(){  
        if(threadStatus != 0)  
            throw new IllegalThreadStateException();  
        ...  
        start0();  
        ...  
    }  
    
private native void start0();

实际上此处真正调用的是start0()方法,此方法在声明处使用的native关键字声明,此关键字表示调用本机的操作系统函数,因为多线程的实现依靠底层操作系统的支持。

第二种:实现Runnable接口

Runnable接口中只定义了run()一个抽象方法。

一般在重复调用start()方法时会抛出“IllegalThreadStateException”异常

Thread和Runnable的联系和区别

联系:Thread类实现了Runnable接口,下面是Thread类的定义

所以如果在继承Thread类时没有重写run()方法,则target = null,不会执行任何操作。

区别:
继承Thread类不适合多个线程共享资源,因为每创建一个线程对象,每个对象都有自己的属性、方法,也都有自己的run()方法;继承Thread类后就不能再继承其他的类。

实现Runnable接口,方便实现资源共享,可以使用一个实现Runnable接口的类对象创建多个线程,它们共用一个Runnable对象,共用里面的属性、方法,共用run()方法。实现Runnable接口不影响继承其他类和实现其他接口,灵活性更好

 

线程的五种状态

新建状态:当一个线程对象被创建后就处于新建状态,这时还只是一个普通的对象,不能被线程调度程序调度

准备状态调用了start()方法后就进入准备状态,进入线程队列排队,随时可能被线程调度程序调度,获取CPU执行时间。一旦进入准备状态的线程就不能再回到新建状态。

运行状态获取了CPU时间就进入运行状态,但是持续执行的时间是不能保证的,处于运行状态的线程随时可能被调度回到准备状态。由于需要等待某些必要的条件,或执行了特定的方法,也可能进入阻塞状态。

等待/阻塞状态:由于等待、阻塞、或睡眠等原因

睡眠:调用了sleep()方法
阻塞:调用了阻塞方法,而正好又满足了阻塞的情况,则进入阻塞状态,直到阻塞条件解除再进入准备状态。比如,调用了接受网络连接请求的accpet()方法,而此时没有连接请求的到来;执行一些耗时的输入输出操作
等待:运行的线程由于逻辑条件不满足,自己调用wait()方法进入等待状态,直到收到通知的消息才进入准备状态

死亡状态:线程正确执行完毕或发生异常而终止执行时,就进入死亡状态。死亡状态的线程可以当作普通对象来使用,例如调用其成员方法或属性,但不能再次启动执行,否则会抛出IllegalThreadStateException异常 。

 

 

 

© 著作权归作者所有

zxlc
粉丝 0
博文 3
码字总数 2286
作品 0
私信 提问
Java入门系列-21-多线程

什么是线程 在操作系统中,一个应用程序的执行实例就是进程,进程有独立的内存空间和系统资源,在任务管理器中可以看到进程。 线程是CPU调度和分派的基本单位,也是进程中执行运算的最小单位...

极客大全
2018/11/07
0
0
java创建线程的三种方式(学习笔记)

参考书:疯狂java讲义,java程序设计基础。 1新建状态(newborn)当一个Thread类或者其子类的对象被声明或者是创建,但没有执行的这段状态称为新建状态。 2.就绪状态(runnable)就绪状态也称...

奔跑的码农
2016/05/18
679
0
Java多线程编程要点 (一)

1、 认识Thread和Runnable Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口。Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run...

曾赛
2010/04/27
274
0
JAVA多线程编程核心技术-学习笔记

进程和线程 进程是操作系统拓扑管理的基本单位 线程是进程中,独立运行的子任务 线程启动 在多线程中, 代码的顺序 , [不是]线程的执行顺序. start()和run() start()是启动新线程执行方法,异步...

ol_O_O_lo
2018/09/21
0
0
聊聊并发(十三)—AQS框架深入分析

并发系列 聊聊并发(一)深入分析Volatile的实现原理 聊聊并发(二)Java SE1.6中的Synchronized 聊聊并发(三)Java线程池的分析和使用 聊聊并发(四)深入分析ConcurrentHashMap 聊聊并发(...

陶邦仁
2015/11/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 程序员做噩梦

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# 手嶌葵《Kiss The Girl》 《Kiss The Girl》- 手嶌葵 手机党少年们想听歌,请使劲儿戳(这里) @Sharon啊 :今天...

小小编辑
32分钟前
77
5
Another app is currently holding the yum lock; waiting for it to exit...

Another app is currently holding the yum lock; waiting for it to exit... The other application is: PackageKit Memory : 153 M RSS (266 MB VSZ) Started: Thu Jul 12 00:03......

圣洁之子
40分钟前
2
0
FastDateFormat 研究

FastDateFormat 对缓存的利用,其实就是用ConcurrentHashMap 做了一个map类型的缓存 public F getInstance(final String pattern, TimeZone timeZone, Locale locale) { Validate......

暗中观察
今天
3
0
Android双向绑定原理简述

Android双向绑定原理简述 双向绑定涉及两个部分,即将业务状态的变化传递给UI,以及将用户输入信息传递给业务模型。 首先我们来看业务状态是如何传递给UI的。开启dataBinding后,编译器为布局...

tommwq
今天
4
0
Spring系列教程八: Spring实现事务的两种方式

一、 Spring事务概念: 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。...

我叫小糖主
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部