本章主要介绍在Java中如何实现多线程。
类名 | 备注 |
java.lang.Thread | 线程类,使用它可以使一个类线程化。 |
java.lang.Runnable | 实现多线程机制的另一种办法 |
目录
1、线程概述
在了解线程Thread之前,我们先来了解一下几个概念。
程序program:一段静态代码,它是应用软件执行的蓝本。
进行process:程序的一次动态执行过程,它对应了从代码加载,执行到执行完毕的一个完整过程。这个过程本身也是进程从产生,发展到消亡的过程。
线程Thread:比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索。
线程只见可以共享相同的内存单元,包括数据和代码,并利用这些共享单元来实现数据交换、实时通信和必要的同步操作。
每个Java程序都有一个缺省的主线程,想要实现多线程,必须在主线程中创建新的线程对象。
线程在一个完整的生命周期通常要经历五种状态。
新建new:当一个Thread类或其子类的对象被声明并创建时,新生的Thread对象就处于new状态,此事它已经有了相应的内存空间和其它资源,并已被初始化。
就绪runnable:处于new状态的Thread被启动后start(),将进入线程队列排队等待CPU时间片,此时它已经具备了运行条件,一旦轮到它来享用CPU资源,就可以脱离创建它的主线程独立运行。哪些处于阻塞状态的线程被解除阻塞后也会进入就绪状态。
运行running:当就绪状态的Thread被调度获得CPU资源时,便进入运行状态。每一个Thread类都有一个重要的run()方法,当线程被调度执行时,它将自动调用run方法,从第一句开始顺序执行。
阻塞block:一个正在执行的Thread在某些特殊情况下,如被认为挂起,将让出CPU资源暂时终止自己的执行,进入阻塞状态。阻塞时不能进入排队队列,只有当阻塞消失后才可以转入就绪状态,重新进入到线程队列中排队等待CUP资源,以便从原来中止处开始继续执行。
死亡DEAD:处于死亡状态的线程不具有继续运行的能力。有两个原因导致线程死亡,一个是Thread运行完run方法的最后一个语句并退出。另一个原因是线程被强制中止,stop()或destroy()方法。
package com.example.restservice;
public class ThreadTest extends Thread {
private int countdown = 3;
private int threadNumber;
private static int threadCount = 0;
public ThreadTest() {
threadNumber = ++threadCount;
System.out.println("Creating a new Thread " + threadNumber);
}
public void run() {
while(true) {
System.out.println("Thread " + threadNumber + " running(" + countdown + ")" );
if(--countdown == 0) {
System.out.println("Thread " + threadNumber + " dead");
return;
}
}
}
public static void main(String[] arg) {
for(int i=0; i<=5; i++) {
new ThreadTest().start();
}