线程和进程的区别和联系

一、什么是进程

进程(Process), 是一个具有独立功能的程序关于某个数据集合的一次运行活动,是系统进行 【资源分配和调度】 的一个独立单位。

  • 进程是【程序】的【一次执行】(是计算机中程序的执行过程,而不是计算机中的程序)
  • 进程是系统进行【资源分配和调度】的一个【基本】单位。

二、进程的特征

  • 动态性:由创建而生,由撤销而亡
  • 并发性:多个进行同时运行
  • 独立性:独立资源分配
  • 异步性:相互独立、互不干扰

三、什么是线程

  • 一个线程就是一个指令流,将指令集合中的一条条的指令以一定的顺序交给CPU去执行。
  • 线程指的是进程中一个单一顺序的控制流。
  • 线程是进程中真正执行任务的基本单位。
    线程是操作系统进行运算调度的最小单元,它是进程的子任务,用于保证程序的实时性,实现进程内部的并发,它不能独立拥有系统资源,但它可与同属一个进程的其他线程共享该进程所拥有的全部资源。

四、线程和栈的关系

对于学过JVM的同学来说,我们java要执行的指令都是放在虚拟机栈当中,通过指令的入栈出栈来实现程序的执行。
而线程是一个指令流,将栈当中的指令一定的顺序交给CPU去执行,是线程的执行过程。
在这里插入图片描述

五、线程和进程的关系

在这里插入图片描述

六、用代码去理解线程和进行

1.了解单线程

//首先我们新建一个类ThreadNew
public class ThreadNew {
    private int flag;

    public ThreadNew(int flag){
        this.flag = flag;
    }

   public void run(){
        if(flag == 1){
             for (int i= 0;i<1000000;i++){
                    System.out.println("执行任务1");
              }
         }else {
             for (int i= 0;i<1000000;i++){
                   System.out.println("执行任务2");
         }
    }
  }
}
public static void main(String[] args) {
    ThreadNew t1 = new ThreadNew(1);
    ThreadNew t2 = new ThreadNew(2);
    t1.run();
    t2.run();
    System.out.println("我是主方法,我是来测试顺序的");
}

输出:
我们的输出是首先输出“执行任务1”,输出完毕之后;其次执行“执行任务2”,输出完毕之后;最后输出“我是主方法,我是来测试顺序的”。

这样输出的原因在于我们的程序,main方法首先入栈,main()当中的程序依次执行,首先创建t1和t2两个对象。之后t1对象调用自己的run()方法入栈,根据条件执行flag=1的for循环,执行完毕以后,t1对象的run()方法出栈。t2对象的run()方法入栈,根据条件执行flag=2的for循环,执行完毕以后,t2对象的run()方法出栈,之后执行main方法当中的System.out.println(“我是主方法,我是来测试顺序的”);

在这里插入图片描述

2.多线程

在这里插入图片描述
在这里插入图片描述
从输出效果上来看我们发现线程的输出的交替执行,这是因为随着内核当中的时间片的轮转,我们需要将数据不断的写会内存,写会内存的过程当中总会有线程占据总线,这样就导致了数据的来回切换。
同时我们还需要注意到,main方法当中有一个输出,这个竟然是第一个输出出来的。这说明:线程之间是相互独立的,谁也不会等待谁先执行完毕
在这里插入图片描述

七、为什么要引入线程

引入线程的主要目的是为了提高程序的并发性
例如我们想要实现一个文件输入的功能,如果用多进程去做,我们需要实现2个进程,一个用来响应鼠标、键盘的交互线程,一个用来运算数据。为使程序能并发执行,系统必须对进程进行以下的一系列操作:创建进程、撤销进程以及进程间切换。据此可知,由于进程是一个资源的拥有者,因而在创建、撤消和切换中,系统必须为之付出较大的时空开销,从而限制了并发程度的进一步提高。

但是如果我们用线程去实现,那么我们就可以将文件输入的功能交给一个进程去实现,同时该进程内部可以有2个线程,一个用来响应鼠标、键盘的交互线程,一个用来运算。由于线程之间共享内存同时线程也比进程更加轻量化,那么导致进程这个资源的拥有者不至于被频繁的创建、撤消和切换。同时即便是要进行切换,那么线程的切换导致的系统开销比进程的切换更小,从而能大大提示程序的并发性。

八、进程和线程的区别

1.从属关系: 进程是正在运行程序的实例,进程中包含了线程,而线程中不能包含进程。线程不能独立于进程而存在。
2.描述侧重点: 进程是操作系统分配资源的基本单位,而线程是操作系统调度的基本单位。
3.共享资源: 多个进程间不能共享资源,而多个线程可以共享同一进程资源文件(堆和方法区)。
4.操纵者: 一般情况下进程的操作者是操作系统,而线程的操作者是编程人员。
5.上下文切换: 线程上下文切换速度比进程的上下文切换速度更快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青城小虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值