首页 > 技术文章 > java多线程梳理(1)

chsblog 2021-11-04 14:00 原文

要开始了解多线程的知识我们先得理解线程是什么?线程和进程之间关系?

线程是什么?

线程是程序的一个指令序列,具有传统进程所具有的特征,故又称为轻型进程或进程元。线程一般包含于进程当中,一个进程可能有一个或多个线程。

 

线程和进程的区别?

进程是操作系统资源分配的基本单位,线程是处理器任务调度和执行的基本单元。

资源方面:每个进程都有独立的代码和数据空间,程序间的切换会有较大开销;线程因为是轻量级进程,每一个线程都有自己运行栈和程序计数器,切换开销较小。

内存分配:统一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。

影响关系:一个进程崩溃后,在保护模式下不会对其他进程造成影响。但是一个线程崩溃往往会引起一整个进程都死掉。

执行过程:每个独立的进程都有程序运行的入口,顺序执行序列和程序出口。但是线程不能独立执行,必须依靠应用程序,由其提供多个线程执行控制,两者均可并发执行。

 

创建多线程的三种方式

1)继承Thread类的方式创建多线程

编写简单,直接继承即可,访问当前线程只需要调用this指针。但是继承Thread类无法再去继承其他父类。

代码示例:

public class Test extends Thread{//继承Thread类

  public void run(){//重写run方法

  }

}

public class Main {

  public static void main(String[] args){

    new Test().start();//创建并启动线程

  }

}

2)采用实现Runnable接口实现多线程


线程可以继承其他父类或者其他接口,更为灵活。但是编程复杂,访问当前进程,需要使用Thread.currentThread()方法。

代码示例:

public class Test2 implements Runnable {//实现Runnable接口

  public void run(){//重写run方法

  }

}

public class Main {

  public static void main(String[] args){

    //创建并启动线程

    Test myThread=new Test();

    Thread thread=new Thread(Test);

    thread().start();

    //或者 new Thread(new Test()).start();

  }

}

3)使用Callable接口创建多线程(不常用)


与Runnable相似,不过继承的Callable会有一个功能更为强大的call()方法,可以有返回值,且能抛出异常。我自己也没用过。

 

线程的状态

线程的生命周期及五种基本状态

 

 

1)新建状态(new):当线程对象创建后,就进入了新建状态。如:Thread t =new Thread();

2)就绪状态(Runnable):当调用线程对象的start()方法(t.start()),线程就进入就绪状态。注意,线程进入就绪状态只是说明线程做好了准备,等待cpu调度,不代表立马执行。

3)运行状态(Running):当cpu开始调度处于就绪状态的线程时,此时线程进入运行状态。就绪状态是进入运行状态的唯一入口,意思想进入运行状态,首先必须处于就绪状态中。

4)阻塞状态:处于运行状态中的线程由于某种原因,暂时放弃对cpu的使用权,停止执行,此时进入阻塞状态,直到进入到就绪状态,才有机会进入到运行状态。分为三种:

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

2.同步阻塞:线程在获取synchronize同步锁失败(因为锁被其他线程占用),它会进入同步阻塞状态;

3.其他阻塞:通过调用线程的sleep()或join()或发出了io请求,线程会进入阻塞状态。这种情况 当三种状态结束后会自动转入就绪状态。

5)死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

 

 

 

推荐阅读