1.进程
> 是一个独立运行应用程序
>
> 比如电脑软件,启动起来以后,就是一个进程 qq 微信 等
>
> 进程 需要系统进行分配的,可以获取当前系统内存 网卡 显卡等
>
> 1.独立性
>
> 各个进程之间是互相独立的,互相不影响的。
>
> 2.互斥性
>
> 每个应用程序(软件) 系统分配一个独立的端口号如果一个软件qq端口号 97 idea端口也叫97
>
> 写代码 Demo1 里面 main主函数 Demo1可以看成一个应用程序 就是一个进程
2.线程
进程是由至少一个或者多个线程组成的。
线程是进程最小的基本单位。
线程的特性:
1、抢占式运行,当多个线程执行时,随机执行某个线程
给程序 分配CPU,按照时间片来执行,单位时间片抢占式执行的。随机抢占的
2、资源共享,同一个进程,有多个线程,这个多个线程是可以共享同一个数据的
Java程序:Demo1可以看成一个进程,
一个Java程序中有两个线程:
1.main 主线程
2.垃圾回收的线程
面试题:进程和线程的区别
进程就像是一座大厂,有自己的厂房(内存空间)、工人(线程)和设备(系统资源),比如工人要使用设备需要去配给他,不同大厂之间、设备互不影响,通信需要通过快递(IPC)来实现。而线程就像是大厂里的工人,多个工人共享工厂里的设备和工作区域,能够同步协作完成任务。进程的主要区别是进程是独而线程是同一进程内的共享资源。线程之间的切换比进程快,但也面临着线程安全等问题,需要特殊处理。
3.并行和并发
并行和并发都可以描述同时处理多个任务,但它们的方式不同。
并行:是指同时执行多个任务,每个任务分配有独立的计算机核心或处理器来处理,各任务同时进行并在同一时间完成。可以类比成一条生产线上的多个工人同时完成生产任务,提高工作效率,节省时间。(同时执行)
并发:是指同时执行多个任务,但在同一时间点内只有一个任务能够被处理,任务之间通过快速的切换使得看起来像是同时执行。可以类比成一台机器同时进行打印和扫描工作,系统快速地在打印和扫描任务之间进行切换,看起来是同时进行的。(同时发生,轮流交替执行)
简单来说,就是并行是真正的同时处理多个任务,而并发是通过快速切换,在同一时间点内模拟同时处理多个任务。
4.创建线程的两种方式
1、继承Thread类,重写 run方法 实例化Thread子类,然后启动一个线程 start()
2、实现Runnable接口, 重写 run方法 实例化Runnable接口的实现类。然后作为参数给Thread实例 然后启动start()
创建线程的第一种:
创建一个新的执行线程有两种方法。 一个是将一个类声明为Thread的子类。 这个子类应该重写run方法Thread 。 然后可以分配并启动子类的实例。
package com.qf.a_thread;
//1.一个是将一个类声明为`Thread`的子类
class MyThread1 extends Thread {
//2.重写run方法
@Override
public void run() {
//这个线程中干了打印100次的MyThread1线程:
for (int i = 0; i < 10000; i++) {
System.out.println("MyThread1线程:" + i);
}
}
}
class MyThread2 extends Thread {
@Override
public void run() {
//这个线程中干了打印100次的MyThread2线程:
for (int i = 0; i < 10000; i++) {
System.out.println("MyThread2线程:" + i);
}
}
}
public class Demo1 {
public static void main(String[] args) {
//3.新建线程的实例
MyThread1 myThread1 = new MyThread1();
//4.启动线程 启动
myThread1.start();
MyThread2 myThread2 = new MyThread2();
myThread2.start();
for (int i = 0; i < 10000; i++) {
System.out.println("主线程" + i);
}
}
}
练习: 新建两个线程,一个线程打印99乘法表,另外一个线程打印直接三角形
package com.qf.a_thread;
class MyThread3 extends Thread {
@Override
public void run() {
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + i*j + "\t");
}
System.out.println();
}
}
}
class MyThread4 extends Thread {
@Override
public void run() {
for (int i = 1; i < 10 ; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
public class Demo2 {
public static void main(String[] args) {
new MyThread3().start();
new MyThread4().start();
}
}
第二种创建方式:
另一种方法来创建一个线程是声明实现类`Runnable`接口。 那个类然后实现了`run`方法。 然后可以分配类的实例,在创建`Thread`时作为参数传递,并启动。
package com.qf.b_thread;
//声明实现`Runnable`接口的类
class MyThread1 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {