Java学习day22:进程和线程、并发并行、线程创建方式(知识点详解)

声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)


往期回顾

Java学习day21:System类、Runtime类、Date类、Calendar类(知识点详解)-CSDN博客

Java学习day20:常用数据类型的包装类、Math类、Random类(知识点详解)-CSDN博客

Java学习day19:StringBuffer类、枚举类enum(知识点详解)-CSDN博客

 Java学习day22:进程线程、并发并行、线程创建方式

一、进程和线程

1.什么是进程

独立的运行程序
比如咱们电脑软件,你启动起来以后,他就是一个进程。qq   idea
进程需要windows系统的分配。可以获取当前的系统的网卡,内存,显卡等

1.2.进程的两大特点
1.2.1.独立性

各个进程之间是相互的独立的互不影响 的。录屏软件和idea没有关系的

1.2.2.互斥性

每个软件系统都会分配一个独立端口号,如果启动一个软件以后他的端口号97。如果再启动另外一个软件,另外一个软件如果端口也是97,这个程序就启动不了,端口被占用的

2.什么是线程 

进程是由多个或者一个线程组成的。每个进程至少得有一个线程的支撑。脑海里面这样来想,一个进程(qq),qq里面很多个线程在执行。

线程的执行支撑起来了进程的执行。把一个人比作一个进程,那么你身体里面的细胞就是线程。如果没有细胞。这个人还存在吗?不存在的!!!

进程包含了线程,线程是组成进程的最小基本单位。

2.1线程特性
2.1.1.抢占式运行的【重要】

CPU在执行的时候,按照时间片来执行的,单位的时间片是抢占是执行比如  idea、qq抢占CPU的,比如qq的线程抢到cpu,idea线程等待.

而且不是说某个线程抢到了cpu后就一直执行它,很可能还没有执行完,就被其他线程抢走了

2.1.2.资源共享性

一个线程可以共享当前CPU, 网卡等。

2.2Java程序的线程

一个Java程序就是一个进程  Demo1 就是一个应用程序  就是一个进程

一个Java程序Demo1里面至少两个线程。

main主函数线程和JVM垃圾回收器线程。

 3.线程和进程的区别【面试题】

进程是一个应用程序,是独立的
线程是进程中最小的基本单位。
把进程比作生产车间,每个流水线就是一个线程
进程有独立性和互斥性
线程有抢占式资源共享特性

二、并发和并行 

并发:同时发生,轮流交替执行

并行:真正意义的同时执行

比如:
 你去饭店点了两个菜,生活中拿个筷子轮流夹菜哦这就是并发场景
,端起盘子,同时倒到嘴里面,这就是并行场景

三、5.创建线程的两种方式【重点】

1.将一个类声明为`Thread`的子类。

这个子类应该重写`run`方法 。 然后可以分配并启动子类的实例。

示例:

// 一个是将一个类声明为Thread的子类。
// 这个子类应该重写run类的方法Thread 。
// 然后可以分配并启动子类的实例。
class MyThread1 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 500; i++) {
            System.out.println("我是myThread1线程:" + i);
        }
    }
}
class MyThread2 extends Thread {
    @Override
    public void run() {//run方法中写功能代码  就是一个线程中执行的一个功能
        for (int i = 0; i < 500; i++) {
            System.out.println("我是mythread2线程:" + i);
        }
    }
}
public class Demo1 {
    public static void main(String[] args) {
        //官方手册中说,要去实例化Thread的子类,并启动线程
        MyThread1 myThread1 = new MyThread1();
        //启动线程 使用start方法  在主线程中开启子线程
        myThread1.start();
        MyThread2 myThread2 = new MyThread2();
        myThread2.start();
        //现在有几个线程?  3个
        //一个是MyThread1线程  一个是主线程(main)  一个垃圾回收机制线程
        for (int i = 0; i < 500; i++) {
            System.out.println("主函数线程:" + i);
        }
        //发现先执行了主线程,然后再执行子线程,然后又执行主线程
        //这就线程的抢占式的运行
        //三个线程:
        //你自己吃三盘菜,咋吃?
        //一盘菜代表一个线程,一盘菜夹一下,随机的吧。
        //开启一个线程,就是在执行一个任务。
        //上面这个代码,你们执行结果和我执行的结果一样吗?绝对不一样的
        //抢占式的,随机执行线程的!!!

    }
}

启动线程不是调用run方法,而是调用start方法,这点别记混了,同时从结果上看能够很明显的体现出抢占式运行的特点。

2.创建一个线程是声明实现类`Runnable`接口。

哪个类然后实现了`run`方法。然后可以分配类的实例,在创建`Thread`时作为参数传递,并启动。 

//另一种方法来创建一个线程是声明实现类Runnable接口。
// 那个类然后实现了run方法。 
// 然后可以分配类的实例(创建类的对象),在创建Thread实例时作为参数传递,并启动。
class MyThread3 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("MyThread3:" + i);
        }
    }
}
class MyaThread4 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("MyThread4:" + i);
        }
    }
}
public class Demo2 {
    public static void main(String[] args) {
        MyThread3 myThread3 = new MyThread3();
        //Thread(Runnable target)  参数是Runnable这个接口对象
        //分配一个新的 Thread对象。
        Thread thread = new Thread(myThread3);
        thread.start();
        MyaThread4 myaThread4 = new MyaThread4();
        Thread thread1 = new Thread(myaThread4);
        thread1.start();
        for (int i = 0; i < 100; i++) {
            System.out.println("main主线程:" + i);
        }
        //有几个线程做任务的线程  3个 一个是main主线程  一个是MyThread3
        //一个MyThread4这个线程
        //可以发现运行的结果是随机执行的!!!

    }
}

先实现runnable接口,此时也是必须重写run方法,这是接口的抽象方法,然后创建类的实例,把实现类对象作为参数传递给thread类(这是开发中常用的方法) 


以上,就是今天的所有知识点了。线程进程是java知识点中非常非常重要的知识点,但是并不算难,大家得多花点时间,静下心看代码,写代码,多理解,多运用,重点是多去运用。

加油吧,预祝大家变得更强!

你可能感兴趣的:(java从0到1,java,学习,开发语言,intellij-idea,java-ee)