操作系统(3)-线程的六大状态、基于代码实战的线程创建及六个常用方法

一、进程和线程的简介

进程的概念

1、 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位;
2、 进程中所包含的一个或多个执行单元成为线程进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问;
3、 线程智能属于一个进程并且它智能访问该进程所拥有的资源当操作系统创建一个进程后,该进程会被申请一个名为主线程或首要线程的线程;

线程的概念:

  • 一个线程是进程的一个顺序执行流。同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行的堆栈。线程在切换时负荷小。因此,线程成为轻负荷进程。一个进程中可以有多个线程。

进程和线程的区别:

1、 地址空间:进程的各个线程,它们共享进程的地址空间,而进程有自己独立的地址空间;
2、 执行速度:线程的切换速度要比进程快的多;
3、 相互依赖上:进程是资源分配和拥有的单位,同一个进程内的线程共享进程资源;
4、 线程是处理器调度的基本单位,但进程不是;
5、 二者皆可并发执行;

线程的适用场合:

  • 适用于一个程序中需要多个任务同时执行,此时可以借助多线程来完成这个任务。

二、线程的状态:

线程的六大状态简介:

1、 NEW:线程刚创建;
2、 RUNNABLE:在JVM中正在运行的线程;
3、 BLOCKED:线程处于阻塞状态,等待监视锁,可以重新进行同步代码块中执行;
4、 WAITING:等待状态;
5、 TIMED_WAITING:调用sleep()join()wait()方法可能导致线程处于等待状态;
6、 TERMINATED:线程执行完毕,已经退出;

线程的六大状态图:

线程的六大状态转换过程详解:

1、 当线程继承Thread或者实现了Runnable创建了线程对象后,当new线程对象过后线程就进入了初始的状态;
2、 当线程对象调用了start()方法的时候,线程启动进入可运行的状态;
3、 线程进入可运行状态后,如果逻辑完成那么线程将会终结,如果没有执行完毕中间JVM分配时间片用完,将进入可运行状态,一旦线程被JVM选中则立即执行;
4、 运行状态的情况比较复杂;

1、 第一:线程如果执行run()main()方法结束后,完成逻辑,线程就进入Terminated;
2、 第二:当线程调用sleep()或者join()方法就会进入Blocked状态,但是要注意的是阻塞的线程是不释放当前所占有的系统资源,当sleep()结束或者join()等待其他线程来到,当前线程则进入Runnable状态等待JVM分配资源;
3、 第三:当线程进入Runnable状态,但是还没有开始运行的时候,此时发现需要的资源处于同步状态synchronized,这个时候线程将会进入Timed_waiting状态,JVM会使用队列对这些线程进行控制,既先进行Timewaiting的线程会先得到JVM资源进行执行进入Waiting;
4、 第四:如果处于Runnable的线程调用yield()让出JVM资源,那么就会进入New状态和其他New状态线程进行竞争重新进入Runnable;
5、 第五:如果当前线程调用wait()方法,则当前线程进入Timed_waiting但是这个时候当前线程会释放所占有的JVM资源,进入这个状态过后是不能自动唤醒的,必须调用notify()或者notifyAll()方法,线程进入Waiting;

线程的创建和API

创建线程的几种方式

三、线程的常用方法讲解及API

获取当前的线程:Thread.currentThread

1)获取运行当前代码片段的线程

代码实例:

[ ]nbsp_nbsp 1

2)获取当前现成的其它线程信息,方法如下:

1、 getId:返回该线程的标识符;
2、 getName:返回该线程的名称;
3、 getPriority:返回线程优先级;
4、 getState:获取当前线程状态;
5、 isAlive:测试线程是否处于活动状态;
6、 isDaemon:线程是否为守护线程;
7、 isInterrupted:是否已经中断;

代码实例:

[ ]nbsp_nbsp 2

线程优先级:

更改线程优先级的方法:setPriority(int priority)

线程的切换是由线程调度控制的,无法通过代码来干涉,但是可以通过提高线程优先级来最大程度改善线程获取时间片的几率。优先级分为10级,值为1-10,1最低,10最高。

线程优先级的三个常量:

1、 Thread.MIN_PRIORITY;
2、 Thread.MAX_PRIORITY;
3、 Thread.NORM_PRIORITY;

代码实例:

[ ]nbsp_nbsp 3

守护线程:

设置线程为守护线程的方法:setDaemon(boolean)

Java中线程分为两种类型:用户线程和守护线程。通过Thread.setDaemon(true)设置为守护线程。如果不设置次此属性,默认为用户线程。

用户线程和守护线程的区别:

1、 主线程结束后用户线程还会继续运行,在没有用户线程可服务时会自动离开;
2、 守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务;

代码实例:

[ ]nbsp_nbsp 4

休眠方法:

Static void sleep(long ms)

该方法会使当前线程进入阻塞状态指定毫秒,当阻塞指定毫秒后,当前线程会重新进入Runnable状态,等待划分时间片。

代码实例:

[ ]nbsp_nbsp 5

yeild、join方法

1)yeild方法:

static void yield()

用于使当前线程主动让出当次CPU时间片回到Runnable状态,等待分配时间片。

2)join方法:

void join()

用于等待当前线程结束,才会让其它线程执行。

调用时需要捕获InterruptException

join方法的代码实例:

[ ]nbsp_nbsp 6


参考文章

1、 https://jingyan.baidu.com/article/6b97984dfec1481ca2b0bf14.html

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: