1.概述

  • Java给多线程编程提供了内置的支持,一个多线程程序包含两个或多个能并发运行的部分
  • 程序的每一个部分都称为一个线程,并且每个线程定义了一个独立的执行路径
  • 多线程是多任务的一种特别的形式,但多线程使用了更小的·资源开销
  • 这里定义和线程相关的另一个术语,进程:一个进程包括由操作系统分配的内存空间
  • 包含一个或者多个线程,一个线程不能独立的存在,它必须是进程的一部分
  • 一个进程一直运行,直到所有的非守候线程都结束运行后才能结束。
  • 多线程能满足程序员编写高效率的程序来达到充分利用CPU的目的。

1. 新建状态

使用new关键字和Thread类或者其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序start()这个线程

2. 就绪状态

当线程对象调用了start()方法之后,该线程就进入就绪状态,就绪状态的线程处于就绪列队中,要等待JVM里线程调度器的调度

3. 运行状态

如果就绪状态的线程获取CPU资源,就可以执行run(),此时线程便处于运行状态

处于运行状态的线程最为复杂,它可以变为阻塞状态,就绪状态和死亡状态

4. 阻塞状态

如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后

该线程就会从运行状态进入阻塞状态,在睡眠时间已到或获得设备资源后可以重新进入就绪状态,可以分为三种:

​ ① 等待阻塞:运行状态中的线程执行wait()方法,使线程进入到等待阻塞状态

​ ② 同步阻塞:线程在获取synchronized同步锁失败(因为同步锁被其他线程占用)

​ ③ 其他阻塞:通过调用线程的sleep()或者join()发出了I/O请求时,线程就会进入到阻塞状态当sleep()状态超时,join()等待线程终止或超时,或者IO处理完毕,线程重新转入就绪状态

5. 死亡状态

一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态

2. 线程的优先级

每一个java线程都有一个优先级,这样有助于操作系统确定线程的调度顺序

Java线程的优先级是一个整数,其取值范围是1(Thread.MIN_PRIORITY)到10(Thread.MAX_PRIORITY)。

默认情况下,每一个线程都会分配一个优先级NORM_PRIORITY(5)

具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源,但是线程优先级不能保证线程执行的·顺序,而且非常依赖于平台。

3. 创建一个线程

Java提供了三种·创建线程的方法:

① 通过实现Runnable接口

为了实现Runnable。一个类只需要执行一个方法调用run(),声明如下:

1
Public void run()

你可以重写该方法,重要的是理解的run()可以调用其他方法,使用其他类,并声明变量,就像主线程一样。在创建一个实现Runnable接口的类之后,你可以在类中实例化一个线程对象Thread定义了几个构造方法,下面的·这个是我们经常使用的;

1
Thread(Runnable threadOb, String threadName);

这里,threadOb是一个实现Runnable接口的类的实例,并且threadName指定新线程的名字。新线程创建之后,你调用它的start()方法它才会·运行

1
​	Void start();

下面是一个创建线程并开始让它执行的实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class RunnableDemo implements Runnable{

private Thread t;

private String threadName;



RunnableDemo(String name){

threadName = name;

System.out.println(“Creating”+ threadName);

}



public void run(){

System.out.println(“Running”+ threadName);

try{

for(int I = 4; I > 0; i--){

System.out.println(“Thread:”+ threadName + “,”+ i);



}

}
}

② 通过继承Thread类本身

③ 通过Callable和Future创建线程