为啥我用IDEA测试多线程,一直是先运行main()方法中的代码?然后才会执行多线程?

柔沢十


看到你这个问题,忍不住点进来了,可能你刚刚入门这个程序猿这个行业,我虽然是科班出身,但你知道现在大学生活是太丰富了,学习总是排在最后一位的,导致的结果就是毕业时找工作四处碰壁,所以那时我才算开始系统的研究我这门学科,这个行业吧,怎么说呢,培训速成是可以上手的,但是我觉得还是需要一些基础知识支撑的,比如计算机组成原理、微机原理、汇编语言、编译原理、操作系统、软件工程、面向对象方法、计算机网络、当然还包括类似离散数学、统计学等课程,这些都算是这个行业的基本课程。

额,不好意思,好像扯的有点远了,下面我先回答下你的问题:

如果你想搞懂你的这个问题,你需要先搞明白2个概念,进程是什么、线程又是什么,他们的关系是什么,又是如何工作的。

进程:

这个概念我就按书上写的来了:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

这个解释好像有点糊弄事的意思,其实说的简单点就是,我们操作系统调度的单位,就比如我们启动的IDEA在操作系统里面就是一个进程,我们经常使用的tomcat,启动后也是一个进程,他们在一次启动后在操作系统里都有唯一的进程id,我们经常说的强制关闭某个软件,其实就是杀死这个进程。

进程的5态模型

线程:

线程是一条执行路径,是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。


进程与线程的关系:

  • 一个程序就是一个进程,而一个程序中的多个任务则被称为线程。进程是表示资源分配的基本单位,又是调度运行的基本单位,亦即执行处理机调度的基本单位。
  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
  • 资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量,即每个线程都有自己的堆栈和局部变量。
  • 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

结合你的疑问解释:

你的疑问是为什么会先走main方法,其实我觉得这可以理解为一个传统,java作为之后的语言,对之前的语言的一种致敬。按照程序运行的机制,一个程序的执行必然是由另一个更之前的程序去启动的 最原始的就到了操作系统。说白了main方法就是jvm默认找寻的方法(解释起来比较多,设计到汇编指令,c语言的设计等等,你就可以这么理解java是c语言写的,c语言里面使用的声明main方法的方式作为入口,java自然也是这样,说的更通俗一点就是编译器的源码中把main标记成程序执行的入口),擦我觉得我说的好像不是人话了。

就是说你在IDEA中点击run跑起来的程序就是一个进程,这个进程的入口方法就是mian方法,你所说的多线程是你启动的这个进程中的单元,当然会在mian方法后面执行。


好了,不写了,我也不知道自己在写什么了,其实知道一些,但又写不出来,可能还是一知半解吧,希望能对你的疑问有点帮助吧。


唯一胡小然


main函数是你程序的入口,没有开大门怎么再开其他门呢?

线程

线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

Java多线程

多线程编程的目的,就是“最大限度地利用CPU资源”,当某一线程的处理不需要占用CPU而只和I/O等资源打交道时,让需要占用CPU资源的其他线程有机会获得CPU资源。

Java中如果我们自己没有产生线程,系统会自动产生一个线程,该线程为主线程(main)。因为它是程序开始时就执行的。主线程的重要性体现在两方面:

  1. 它是产生其他子线程的线程;
  2. 通常它必须最后完成执行,因为它执行各种关闭动作。


分享到:


相關文章: