Java多线程系列(一) 初识Thread类

  • 时间:
  • 浏览:
  • 来源:互联网

前言

这篇文章是我尝试理解java多线程的第一篇文章,而Thread类无疑是java多线程的基石。

所以第一篇文章我要从这个类入手,包括这个类的定义和基本使用,为以后更深入的探讨多线程打下基础。

何为Thread

说起Thread,就不得不提所有人都见过的一道面试题

谈一谈进程和线程的区别。

为了更好的理解线程,这里我特别简单的说一下两者的区别:

进程,顾名思义,就是进行中的程序,是操作系统分配资源的基本单位。
线程,就是一个进程中,代码的不同执行路径,也是任务调度的基本单位。

那么重点来了:什么叫代码的不同执行路径呢?

我们见过的代码不是都只有一条执行路径吗?

当然不是啦!我们可以把代码的执行路径想象成公路,如果只有一条公路,那么所有代码都会按部就班的从上到下执行。如果一条公路太拥挤,我们就会去开设辅路,从而减轻主路的压力。这样,汽车就有多条路可以走,而代码也有了多条执行路径。

上面例子中的公路,就可以理解成线程。需要注意,主路和辅路是可以同时跑车的,就像java中的线程是可以同时运行的

而java中的Thread类,就是对线程的抽象

Thread类的使用

Thread的创建

java中,要创建一个线程大致有两个方法,分别是创建一个类,继承Thread类或者实现Runnable的接口。

public class ThreadDemo1 {
    public static void main(String[] args) {
        (new Thread1()).start();
        (new Thread(new Thread2())).start();
        for(int i = 0; i < 5; i++) {
            Thread.sleep(50);
            System.out.println(Thread.currentThread().getName());
        }
    }
}

class Thread1 extends Thread {
    @Override
    public void run() {
        for(int i = 0; i < 5; i++) {
            Thread.sleep(50);
            System.out.println(Thread.currentThread().getName());
        }
    }
}

class Thread2 implements Runnable {
    @Override
    public void run() {
        for(int i = 0; i < 5; i++) {
           	Thread.sleep(50);
            System.out.println(Thread.currentThread().getName());
        }
    }
}

上面的代码用图表示出来就是下图:
在这里插入图片描述
分别通过extends Thread并重写 run()方法(Thread1)和通过implements Runnable并重写run()方法(Thread2),额外的创造了两个线程,并在主线程中,通过start()方法,让它们运行起来。

Thread类的sleep和join

我们主要介绍两个Thread类的常用API,sleep()join()

sleep() 方法

通过在当前线程中调用Thread.sleep(long ms) 可以让当前线程暂停指定的时间,单位是毫秒。

join() 方法

通过在当前线程调用其他线程的join方法,可以让当前线程等待其他线程。当其他线程运行完了,当前线程从调用join的地方继续运行。

join方法的执行顺序可以用下图来表示
在这里插入图片描述

Thread对象的状态

Thread类的对象总共有6种状态,通过Thread.State这个枚举类来表示。

可以通过thread.getState()来获取当前线程所处的状态。

这六种状态之间可以相互转换。

NEW:当一个线程对象被new出来,调用start()方法之前的状态。

RUNNABLE:NEW 状态的线程调用start()之后进入RUNNABLE 状态。然而该状态只是一个统称,由以下两个状态构成:

  • READY : 可以运行但没运行的状态。因为毕竟CPU有限,同一颗CPU同一时间只能运行一个线程。因此需要调度,没被CPU运行的线程就是READY状态。
  • RUNNING:正在运行的状态。线程中的代码被实际执行了。

BLOCKED: 阻塞状态。线程等待进入被synchronized修饰的代码块的时候所处的状态。获取到该段代码块执行权的时候,线程回到RUNNNING状态。

WAITING: 处于该状态的线程不会被分配CPU时间,即不会进入调度队列。只有显式的被唤醒之后,线程才会重新运行。

TIMED_WAITING:处于该状态的线程也不会被分配CPU时间,但是可以被其他线程唤醒,或者到达某一时间后被唤醒。

TERMINATED:中止状态。只线程中的run()方法或者主线程中的main()方法执行完成之后,线程所处的状态。这个状态的线程就没办法复生了。

总结

本篇文章主要介绍了什么是线程以及它在java中的抽象Thread类。以及该类的基本使用方法,不同状态之间的迁移等等。

在未来的关于多线程的讨论中,我们都要在熟悉该类的情况下进行。

本文链接http://www.dzjqx.cn/news/show-617548.html