Java 多线程实现

Posted 云飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 多线程实现相关的知识,希望对你有一定的参考价值。

多线程的目的

提到多线程就只有一个目录,更好的利用CPU资源,我们让CPU同时处理多个任务,缩短计算和处理时间。

在实现多线程之前,首先了解一个下多线程的一些概念:

多线程:在一个进程中,运行不止一个线程

并行:多个CPU 实例或者多台计算机同时运行一段处理逻辑,该中情况是真正的在时间上同时值行哦

并发:通过CPU的调度算法,让用户看上去好像是在并行,但是实际上CPU并不是真正的同时,下面引用网友一张图:

 

技术分享
 

线程安全:线程安全一般是对变量或者一段代码而言,指在并发的情况下,该代码被多线程使用,但是线程的调度顺序并不会应用最终结果,我们编写程序只需要考虑系统的内存和CPU是否够用即可,反过来,非线程安全即使线程的先后值行可能造成不一样的结果

同步:在Java中的同步指的是通过人为的控制程序值行,保证共同资源来对多线程访问是线程安全的,一般同步有多种实现比如 synchronized 关键字还有CAS算法等

线程的状态

线程从开始到结果经过了如下几种状态:

NEW:新建一个线程,该线程还没有开始运行

RUNNABLE:线程在JAVA虚拟机中运行,但是在等待操作系统资源,比如CPU资源

BLOCKED:线程被阻塞,在等待监视器锁的释放进入同步方法

WAITING:线程等待,该状态是当前线程等待另一个线程值行一个特定的程序

TIMED_WAITING:和WAITING类型,不过该等待会指定一个特定时间

TERMINATED:进程运行完成

以上状态可以参考JAVA 源码中对进程状态的描述:Thread.State

 

技术分享
进程状态间转换

JAVA中锁是监视器提供了必要的支持。逻辑上锁是对象内存堆中头部的一部分数据,JVM中每个对象都拥有一个锁(互斥锁),任何程序都可以使用它来协调对对象的访问,如果任何程序想访问该对象实例,则必须获取该对象的锁(在锁中有区域设置),其他线程试图访问该对象必须等到获取该锁的实例释放锁(改变锁的标记)

锁用来保护代码片段,任何时刻只能有一个线程执行被保护的代码,如果一个方法使用synchronized关键字声明,那么对象的锁将保护整个方法

监视器

监视器可以看作是一个特殊的房间,该房间中有一些数据和代码,但是一次只能有一个人(消费者)使用该房间,如果想进入该房间,必须到大厅(Entry Set)去排队,调度程序会使用某种标准比如FIFO,从大厅中选择一个消费者(线程)进入特殊房间,如果这个线程因为某种原因被挂起,它将会被调度程序安排的等待房间(Wait Set),并经过一段时间之后重新分配到特殊房间。

 

技术分享
 

简单来说:监视器就是用来监视线程进入特殊房间,他确保同一时间只能有一个线程可以访问特殊房间中的数据和代码。

 

技术分享
 

wait/notify必须存在于synchronized中,并且,这三个关键字针对同一个监视器

以上是关于Java 多线程实现的主要内容,如果未能解决你的问题,请参考以下文章

用JAVA多线程实现龟兔赛跑

java中怎样实现多线程执行的结果相加

Java多线程系列-线程创建

JAVA多线程继承Thread 与实现Runnable接口的相关疑问

java编程:java的多线程是怎么实现的?高手进吧

Java多线程实现异步调用