理解java进程和多线程

一、进程是什么,线程是什么?

(1)理解

进程是一个主体任务,线程是这个进程下的子任务,下图解释:

描述:一个餐厅好比一个进程,一个餐厅下面有多个职位的厨师,他们分别是不同进程,执行不同子任务,当然我们一个进程里面可以有多个线程。单核cpu情况下,不同的进程在不同的时间段去使用 CPU 资源。 如果是多核cpu可以在同一时间有多个餐厅,多个进程。

(2)单核cpu和多核cpu:

多核CPU并不代表多个CPU。

多核CPU指的是单个CPU芯片上集成了两个或多个独立的计算核心,这些核心可以同时执行不同的任务,从而提高处理器的性能,每个核心都拥有自己的执行单元,可以独立执行指令。

*(3)cpu调度进程过程 

 

二、进程间通信

进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存 在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备 隔离性 Isolation
但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进 行配合地达到应用的目的,如此,进程之间就需要有进行 信息交换 的需求。进程间通信的需求就应运 而生。

目前,主流操作系统提供的进程通信机制有如下:
1. 管道
2. 共享内存
3. 文件
4. 网络
5. 信号量
6. 信号

总结

看着是不是很复杂,进程之间通信就好比,各个餐厅之间通信,万一餐厅之间间隔很远呢?没错不只是你计算机处理这些进程之间通信也很复杂,那怎末办呢?这里我们引入了多线程,就好比原来是两家餐厅干的活儿集中在一家干了,这样是加重了厨师们的负担但是大大减轻了cpu创建进程消耗的资源。

三、多线程

 (1)"并发编程" 成为 "刚需".

  • 单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU 资源.
  • 有些任务场景需要 "等待 IO", 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程

(2)虽然多进程也能实现 并发编程, 但是线程比进程更轻量.

  • 创建线程比创建进程更快.
  • 销毁线程比销毁进程更快.
  • 调度线程比调度进程更快

*(3)进程和线程之间关系

1、进程包含线程、一个进程可以有一个线程或多个线程

2、进程和线程、都是用来实现并发变成场景的,但是线程比进程更加轻量、高效。

3、同一进程的线程之间共用同一份资源(内存+硬盘),省去了申请资源的开销,所以轻量。

4、进程间不会相互影响,但是同一进程中的线程之间可能相互影响。

5、进程是资源分配的基本单位,线程是调度执行的基本单位。

四、创建多线程 

(1)创建一个单线程

class MyThread extends Thread{//一个线程
    @Override
    public void run() {
        System.out.println("hello thread");//run方法只是描述线程执行的任务
    }
}
public class Main {
    public static void main(String[] args) {
    Thread t=new MyThread();
    t.start();//线程调用
    }
}

 

(2)多线程创建 

class MyThread extends Thread{//一个线程
    @Override
    public void run() {
        while (true){
            System.out.println("hello thread");//run方法只是描述线程执行的任务
            try {
                Thread.sleep(1000);//sleep就是休息一下在执行,方便结果观察
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
public class Main {
    public static void main(String[] args) throws InterruptedException {//这里main也是一个线程
    Thread t=new MyThread();
    t.start();//线程调用
        while (true){
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}

 

总结:我们发现线程是并发执行的,就是同时打印hello main 和 hello thread ,但是这两者打印顺序是随机的。 

 

(3)简化的多线程写法(lambda表达式)

public class Test1 {
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            while (true){
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            } 
        });
        t.start();
        while (true){
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值