JAVA多线程详解

昨天同事分享了一个关于java多线程的文章,好奇(多线程自己掌握的很不好)点进去看了看,看了一章就被吸引了,大佬讲的就是好。正要继续看的时候,你懂得,要收费了。。。没办法,就决定今天下班花点时间来把这一块东西看一下,然后总结一下。(本文只是一个入门,用好多线程是一门学问,我估计最少也得写一本书)

在继续之前,我们要先弄清楚什么是进程,什么是线程,什么是并行,什么是并发。

并发

现在我们用到的操作系统都是多任务操作系统,比如我们再进行写代码的时候还可以听歌,看电影。这些都是一个一个的任务,就好像一个cpu同时干好多事情一样,其根本是因为操作系统是分时的,他给每一个任务分了一个时间片,通过操作系统的管理将cpu资源分给各个任务去使用,而cpu就在这些任务之间以极快的速度进行切换,让我们表面上看起来好像他是同时干的这些事。(多个任务抢占相同资源)

并行

当一个电脑拥有多个cpu的时候,一个任务可以独立的占据一个cpu来执行,而另外的cpu可以去单独的执行其他的任务。大家相互独立不占用各自资源。
附上一张特别经典的图

JAVA多线程详解_第1张图片

这就是二者的区别

进程和线程

明白了并发和并行后,我们来看看进程和线程。之前提到操作系统并行运行我们的任务的时候,他会不停的在不同的任务之间进行快速切换,那么首先操作系统要记下来当前任务的断点(比如我们同时看多本书,换书的时候要记下当前书的页码),然后下一次切换回来我们还从断点执行。这就是上下文切换的过程,操作系统进行上下文切换的时候势必会消耗资源,人们为了节省资源就想在任务下添加一些子任务,节省上下文切换的性能开销。我们把进程里的子任务成为线程。慢慢的人们进一步切分了进程和线程之间的职责。把进程当做资源分配的基本单元,把线程当做基本的执行单元,同一进程之间的线程资源共享。

进程和线程同样分为五个阶段:准备、就绪、运行、阻塞、终止

java实现多线程有两个手段

一、实现Runnable接口
二、继承Thread类并重写run方法。

(其实还有第三种 实现callable接口,这里不做详解,推荐使用第一种方法)

一、扩展java.lang.Thread类

JAVA多线程详解_第2张图片
JAVA多线程详解_第3张图片
JAVA多线程详解_第4张图片
说明一下:Main函数启动后,JVM开启一个进程,随着两个线程th1和th2的start()方法执行,两个线程开始执行。

对于乱序输出是因为线程进入运行状态是由操作系统决定的。

二、实现Runnable接口

JAVA多线程详解_第5张图片
JAVA多线程详解_第6张图片
JAVA多线程详解_第7张图片
通过实现Runnable接口的类构造一个线程。run()方法是多线程程序的一个约定,所有的多线程代码都在run方法里执行,通过看源码我们会知道Thread类其实也是实现了Runnable接口。在实现多线程的时候我们把实现Runnable接口的类通过Thread的构造方法实例化一个Thread对象,然后调用start方法启动线程。
实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是扩展Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础。

你可能感兴趣的:(知识点,java多线程)