java多线程(一)

来源:互联网 发布:淘宝特卖怎么删除 编辑:程序博客网 时间:2024/06/08 11:27

一、线程概述

几乎所有的操作系统哦都支持同时运行多个任务,一个任务通常指一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。

1. 线程和进程
所有运行中的任务通常对应一条进程,进程是系统进行资源分配和调度的一个独立单位
进程包含三个特征:

  • 独立性:每一个进程拥有自己私有的地址空间,一个用户进程不可以直接访问其他进程的地址空间
  • 动态性:进程和程序的区别就在于程序是一个静态的指令集合,而进程是一个正在系统中活动的指令集合,进程具有自己的生命周期和各种不同的状态。
  • 并发性:多个进程可以在单个处理器上并发执行,多个进程之间不会互相影响。

注意:并发性并行性是两个不同的概念。并行指在同一时刻,有多条指令在多个处理器上同时执行;并发指多条指令在一个处理器上执行,处理器在同一时刻只能处理一条指令,但多个进程可以被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。

2. 多线程的优势

  • 进程之间不能共享内存,但线程之间共享内存非常容易
  • 系统创建进程需要为该进程重新分配系统资源,但创建线程代价非常小,因此多线程是先多任务并发比多进程效率高很多
  • java语言内置多线程功能,简化了多线程编程

二、线程的创建和启动

Java多线程的创建有两种方法,一种是继承Thread类并重写该类run方法,一种是实现Runnable接口并重写run方法

1. 继承Thread创建线程类
步骤:
a. 定义Thread类的子类,并重新该类的run方法
b. 创建Thread类的子类实例,即创建了线程对象
c. 用线程对象的start方法启动该线程

Thread.currentThread():currentThread是Thread类的静态方法,该方法总是返回当前正在执行的线程对象;getName():是Thread的实例方法,该方法返回调用该方法的线程的名字。

2. 实现Runnable接口创建线程类
步骤:
a. 定义Runnable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的执行体
b. 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象是真正的线程对象
c. 调用线程对象的start方法来启动该线程

3. 两种创建方式对比
继承Thread类:

  • 劣势:线程类已经继承了Thread类,所以不能再继承其他父类
  • 优势:编写简单,若需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this即可获得当前线程

实现Runnable接口:

  • 只是实现了Runnable接口,还可以继承其他类
  • 可以多个线程共享资源
  • 劣势:编程稍微复杂,必须使用Thread.currentThread()方法访问当前线程。

几乎所有的多线程应用都采用实现Runnable接口的方式。

三、线程的生命周期

  1. 当程序使用new关键字创建一个线程之后,该线程处于新建状态。此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体
  2. 当线程对象调用了start()方法后,该线程处于就绪状态,处于这个状态的线程并没有开始运行,它只是表示线程可以运行了。
  3. 处于就绪状态的线程获得了CPU后,该线程处于运行状态,开始执行run方法体中的内容。
  4. 当线程开始运行后,不可能一直处于运行状态,它在运行过程中需要被中断,目的是使其他线程获得执行机会。这时它便进入了阻塞状态
  5. 当run()方法执行完成,线程正常结束;或者线程抛出一个未捕获的Exception或Error;或者线程被调用stop()方法时,线程就处于死亡状态

下图是线程状态转换图:
线程状态转换图

当一个线程已经死亡的情况下,再次调用start()方法来启动该线程时,便会引发IllegalThreadStateException异常,这表明死亡线程无法再次运行。

1 0
原创粉丝点击