Java进程/线程的创建与销毁

本文介绍了Java中的进程和线程概念,包括它们的独立性、动态性、并发性等特点。进程是资源分配的基本单位,线程是处理器调度的基本单位,同一进程的线程共享资源。Java中,进程可通过Runtime或ProcessBuilder创建,线程通过Thread类或Runnable接口启动。线程的结束通常发生在run方法执行完毕或异常时,而进程的退出则依赖于所有线程的结束或System.exit()方法调用。
摘要由CSDN通过智能技术生成

接触java开发或者Android开发的时候,必不可少的会接触到进程、线程这样的概念和知识,那么进程和线程到底是什么,又有什么样的关联以及有什么特点呢?

概述

进程和线程,分别对应的英文单词是Process和Thread。

先说进程,我们一般使用的电脑或者手机在运行的时候,运行的每一个程序之间相互不影响,当一个程序异常崩溃之后,其他程序可以继续执行。简单来理解,每一个程序运行就是一个进程的开启。尤其是Android系统,正常来说会给每一个app分配单独的进程,赋予一定大小的内存资源,确保每一个app都是单独运营,彼此不影响。就相当于操作系统在你运行程序的时候,给你划分了一块地方,接下来你的程序就在这块地方自己蹦跶,不要出来扰乱别人的地方。所以进程之间是相互独立的,资源不共享的。(Android因为每一个程序分配的内存有限,超过内存上限就会OOM,所以有一些app功能较多,为了更好的运行,会申请另一个进程,这样一个app程序就可能对应多个进程,这个后续再说Android多进程相关的内容)

线程呢就是在这个进程中,处理一个一个任务的,在线程的地盘上,你可以买汽水,可以吃饭、可以看电影等等。这些都是一个一个的线程。线程算作轻量级的进程,是进程的一个执行单元,是CPU调度和分派的最小单元,一个进程是有一个或多个线程组成的,同一个进程的线程之间可以共享该进程的资源,同时一个线程可以创建、撤销另一个线程,比如你吃饭的时候可以去看电影或者取消播放电影。

特点和联系

通过以上描述,进程和线程的特点也大概提到了,在说明具体的特点前,我们需要有以下基本认识:

目前所有的操作系统都是支持多任务处理的
对于一个CPU来说,某一时间点只能处理一件事情
处理器执行速度较快,很多事情可以被快速轮换处理,所以在我们感知上只同时被处理的
进程的特点:

独立性
每一个进程都是独立的地盘、资源,相互之间不干涉。

动态性
进程是程序的执行过程,所以就会有被创建、被执行、暂停、撤销、销毁等过程和状态。

并发性
并发性也可以理解为异步,多个进程在系统的执行需要由系统进程管理统一调度以异步的方式通过一定的算法来保证各个进程能够协同共享使用CPU资源和其他资源。

线程的特点

最小性
线程是CPU调度和分配的最小单元。

动态性
线程也是经过创建、执行、挂起、销毁等过程和状态。

关联性
线程依赖于进程,每一个线程必然有一个父进程。

独立性
线程之间也是独立的,一个线程不知道父进程中是否有其他线程。

并发行
线程的执行是抢占式的,每一个线程在执行中都可能被挂起,腾出资源来执行另一个线程。

区别和关联

进程是资源分配的基本单位(划分地盘),线程是处理器调度的基本单位(调度CPU等)。

线程可以启动、撤销另一个线程,一个进程可以有多个线程抢占式式并发执行,每一个线程在执行中都可能被挂起,腾出处理器来执行另一个线程。

线程不能独立执行,线程依赖于进程,一个线程必然有一个父进程,一个程序至少有一个进程,一个进程至少有一个主线程,同一个父进程的线程共享该进程资源(地盘)。

线程之间是独立的,一个线程不知道父进程中是否有其他的线程存在。

调动使用CPU的是线程,在处理器运行的是线程。

同一进程的多个线程共享全局变量、静态变量,堆存储,每一个线程也有自己栈段,用来存储局部或临时变量。

进程的创建、销毁

创建

java中的进程类是Process。前面已经提到,每一个程序的运行基本上都会开启一个进程,然后执行进程的主线程。所以很多时候,我们并不直接去使用代码来创建一个进程,而是交由系统来为每一个程序自动创建进程。执行Java程序都伴随着Java虚拟机的执行,每一个程序都对应着一个虚拟机,可以理解为每一个虚拟机的启动就是一个进程的启动(当然其他语言就不是虚拟机,但是也有进程的概念),然后启动该进程的主线程,由主线程启动其他线程。对应的就是可执行的Java程序中必不可少的一个main方法,main方法是程序的起点,是程序的初始线程,其他线程都由它启动。(Android中启动机制和普通的java程序不一样,所以没有main方法,此处不多说)

通过代码启动一个进程的方法:在java.lang.Runtime类和Java.lang.ProcessBuilder可以来创建一个本地的进程。

具体的使用方法如下(Java1.8):

//打开指定路径的文件夹

Process p1 =Runtime.getRuntime().exec(“open /Users/anonyper/Desktop/未命名文件夹”);

Process p2 = new ProcessBuilder(“open”, “/Users/anonyper/Desktop/未命名文件夹”).start();
Runtime.getRuntime()的其他方法如下:
Process exec(String command)
Process exec(String [] cmdarray)
Process exec(String [] cmdarrag, String [] envp)
Process exec(String [] cmdarrag, String [] envp, File dir)
Process exec(String cmd, String [] envp)
Process exec(String command, String [] envp, File dir)

//可以传入不同的参数、环境变量、以及定义执行的目录
Java.lang.ProcessBuilder的方法如下
public ProcessBuilder(String… var1) {…}
public ProcessBuilder(List var1) {…}
public ProcessBuilder command(List var1) {…}
public ProcessBuilder command(String… var1) {…}

//使用ProcessBuilder可以预先配置相关属性再创建进程,而且也可以在后续使用中随着需要改变相关属性,属性修改之后对已创建的进程没影响,只影响后续的start方法创建的进程。
销毁

只要java虚拟机中还有普通线程(用户线程)在执行,那么虚拟机就不会停止,当没有普通线程时,虚拟机中都是守护线程的话,则虚拟机(该进程)就会退出。

自行退出
我们创建一个基本的可执行的Java程序,该程序中用户线程执行完之后,该进程也就退出了。

//代码一
public class ProcessTest {
public static void main(String[] args) {
System.out.print(“我是main 方法”);
}
}

执行结果:

我是main 方法
Process finished with exit code 0 //可以看到,进程以code 0的结果结束了

//代码二
public class ProcessTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值