Java多线程编程
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 | class RunnableDemo implements Runnable{ |
② 通过继承Thread类本身
③ 通过Callable和Future创建线程