声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)
往期回顾
Java学习day21:System类、Runtime类、Date类、Calendar类(知识点详解)-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知识点中非常非常重要的知识点,但是并不算难,大家得多花点时间,静下心看代码,写代码,多理解,多运用,重点是多去运用。
加油吧,预祝大家变得更强!