说起线程,无法免俗首先要弄清楚的三个概念就是:进程、线程、协程。OK,那什么是进程,什么是线程,哪协程又是啥东西。进程:进程可以简单的理解为运行在操作系统中的程序,程序时静态代码,进程是动态运行着的代码,程序的运行需要向操作系统申请资源比如内存,文件句柄等,特别强调的是进程申请的资源都是独立的,也就是进程与进程之间资源是独立的。它被操作系统调度,所以进程是相对于操作系统的;线程:线程是进程中程序执行任务的那个,它共享着进程申请的资源;协程:可以简单的说是线程制造的轻量线程。讲完了基本的概念看看三者之前的关系图:
从关系图看是不是一目了然。对了还要强调的一点是,进程和线程都是之间或者间接受管于操作系统内核的,而协程是受管于程序,在用户态这边。既然讲到java线程,那java协程咋没听说过呢,java语言没有实现协程,实现协程的语言如python,go等,如果想在java中使用协程咋办,你可以使用协程框架kilim。
讲完概念,直接进入java线程的世界。在java中线程可以使用Thread类构造一个线程对象,没错new Thread()就是一个线程对象了,和new Date()没什么区别,就是一个java 对象实例而已,是不是很简单?这里的简单是指构造简单,但是引入之后的问题可就不简单啦(后面会讲)。我们知道对象自身是有生命周期的,普通java对象就是死与活两种生命周期状态,而对于线程对象则存在new、ready、running、block或者waitting、dead六种状态,状态转换图:
线程状态的转换是依靠JVM调用操作系统内核TCB也就是线程控制模块来实现线程状态切换的。
既然线程在java中也是个对象,那么这个对象的属性又有哪些呢?线程的属性可分为静态和动态属性,静态这里指的是,程序员不可改变的,是有jvm分配的,动态是指程序员可以自定义的虽然jvm给了默认属性值。静态属性:id等;动态属性:name,priority,deamon,group,classloader等。讲了这么多基础的东西,那来实践下才是王道。
从上面程序可以看出,我们运行程序的时候,相当于在操作系统中启动一个jvm的应用程序,也就是进程,然后jvm调用main方法,执行这个main方法的线程是主线程(也就是进程中必然有个入口线程-main thread,即至少一个线程),然后main线程启动了一个子线程。
好了,java线程基础入门篇就介绍到这,下一篇继续线程基础部分的线程内存分配知识。特别说明,本人技术和认识有限,如有错误之处,欢迎朋友们指正,万分感谢。
原文地址:https://www.cnblogs.com/xgoing/p/9488594.html