Java多线程编程核心技术有哪些?具体有哪些操作?

2020-03-27 22:10:30 java常见问答 6204

小伙伴们是否知道Java多线程有哪些技能呢?是否都一一进行了了解并且熟练掌握呢?今天那就由小编给大家带来有关Java多线程技能的详细解说,让我们一起来了解下吧。

进程和线程

一个可并发执行的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统进行资源分配和保护的基本单位。简单的说,进程就是一个程序的一次执行过程。

2.引入线程的动机和思路

操作系统采用进程机制使得多任务能够并发执行,提高了资源使用和系统效率。在早期操作系统中,进程是系统进行资源分配的基本单位,也是处理器调度的基本单位,进程在任一时刻只有一个执行控制流,这种结构称为单线程进程。单线程进程调度时存在进程时空开销大、进程通信代价大、进程并发粒度粗、不适合于并发计算等问题,操作系统引入线程机制来解决这些问题。线程机制的基本思路是,把进程的两项功能——独立分配资源和被调度分派执行分离开来,后一项任务交给线程实体完成。这样,进程作为系统资源分配与保护的独立单位,不需要频繁切换;线程作为系统调度和分派的基本单位会被频繁的调度和切换。

3.线程定义

线程是操作系统进程中能够独立执行的实体,是处理器调度和分派的基本单位。线程是进程的组成部分,每个进程内允许包含多个并发执行的线程。同一个进程中所有的线程共享进程的主存空间和资源,但是不拥有资源。

线程就是进程中的一个负责程序执行的一个控制单元(执行路径)。一个进程中可以有多个执行路径,称之为多线程。

4.进程和线程的区别

定义方面:进程是程序在某个数据集合上的一次执行过程;线程是进程中的一个执行路径。

角色方面:在支持线程机制的系统中,进程是系统资源分配的单位,线程是系统调度的单位。

资源共享方面:进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器。

独立性方面:进程有自己独立的地址空间,而线程没有,线程必须依赖于进程而存在。

多线程的实现

实现多线程编程的方式主要有两种,一种是继承Thread类,另一种是实现Runnable接口。

从jdk源码可以发现,Thread类实现了Runnable接口,他们之间是多态关系。其实,使用继承Thread类的方式创建新线程时,最大的局限就是不支持多继承,因为java语言的特性就是单根继承,所以为了多继承,完全可以实现Runnable接口的方式,一边实现一边继承。但是这两种方式创建的线程在工作时的性质是一样的,没有本质区别。

1.继承Thread类

(1)定义一个类继承Thread类。

(2)覆盖Thread类中的run方法。(方法run称为线程体)

(3)直接创建Thread类的子类对象创建线程。

(4)调用start方法,开启线程并调用线程的任务run方法执行。

注意:run()方法和start()方法的区别。start()方法来启动线程,run()方法当作普通方法的方式调用,程序还是顺序执行。

2.实现Runnable接口

(1)定义类实现Runnable接口

(2)覆盖接口中的run方法,将线程的任务代码封装到run方法中。

(3)通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread构造函数的参数进行传递。线程的任务都封装在Runnable接口子类对象的run方法中。所以要在线程对象创建时就必须明确要运行的任务。

(4)调用线程对象的start方法开启线程。

线程的状态

java多线程编程核心技术

在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。

第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。

第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。

第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。

第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。

第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。

线程从阻塞状态只能进入就绪状态,无法直接进入运行状态。而就绪状态和运行状态之间的转换不受程序控制,而是由系统调度所决定,但是有一个方法例外,调用yield()方法可以让运行状态的线程转入就绪状态。

常用API

1、currentThread()方法:返回代码段正在被哪个线程调用

2、2、isAlive()方法:判断当前线程是否处于活动状态。活动状态就是线程已经启动且尚未终止。线程处于正在运行或准备开始运行的状态。

3、sleep()方法:在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行)。这个正在执行的线程是指this.currentThread()返回的线程。

4、getId()方法:取得线程的唯一标识。

5、yield()方法:放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但是放弃时间不确定,有可能刚刚放弃,马上有获得CPU时间片。

停止线程

在java中有以下三种方法可以终止正在运行的线程。

(1)使用退出标记,使线程正常退出,也就是当run方法完成之后线程终止。

(2)使用stop方法强行终止线程,但是不推荐使用这种方法,因为stop和suspend及resume一样,都是作废过期的方法,使用它们可能产生不可预料的结果。

(3)使用interrupt方法中断线程。需要注意的是interrupt方法仅仅是在当前线程中打了一个停止的标记,并不是真正的停止线程,需要与标记一起使用来停止线程。

守护线程

在java中有两种线程,一种是用户线程,另一种是守护线程。

守护线程是一种特殊的线程,当进程中不存在非守护线程则守护线程自动销毁。典型的守护线程就是垃圾回收线程,当线程中没有非守护线程了,则垃圾回收线程也就没有存在的必要了,自动销毁。

该方法必须在启动线程前调用。守护线程和其他的线程城在开始和运行都是一样的,轮流抢占cpu的执行权,结束时不同。正常线程都需要手动结束,对于后台线程,如果所有的前台线程都结束了,后台线程无论处于什么状态都自动结束。

好了,以上就是今天所讲的Java多线程的技能,更多知识请关注本网站哦。