什么是进程,什么是线程?
进程:进程是程序的一次执行,是系统进行资源分配和调度的独立单位。每一个进程都有它自己的内存空间和系统资源。
线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
一个程序至少一个进程,一个进程至少一个线程。
进程线程的区别
- 地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
- 资源拥有:同一进程内的线程共享本进程的资源,但是进程之间的资源是独立的。
- 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
- 进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
- 执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 线程是处理器调度的基本单位,但是进程不是。
- 进程是并行的,线程是并发的
并行与并发
- 并行:
并行性是指同一时刻内发生两个或多个事件,是在不同实体上的多个事件 - 并发:
并发性是指同一时间间隔内发生两个或多个事件,是在同一实体上的多个事件
Java 实现多线程
-
继承 Thread,重写 run 方法
public class MyThread extends Thread { @Override public void run() {for (int x = 0; x < 200; x++) {System.out.println(x); } } }
public class MyThreadDemo {public static void main(String[] args) { // 创建两个线程对象 MyThread my1 = new MyThread(); MyThread my2 = new MyThread(); my1.start(); my2.start();} }
-
实现 Runnable 接口,重写 run 方法
public class MyRunnable implements Runnable { @Override public void run() {for (int x = 0; x < 100; x++) {System.out.println(x); } } }
public class MyRunnableDemo {public static void main(String[] args) { // 创建 MyRunnable 类的对象 MyRunnable my = new MyRunnable(); Thread t1 = new Thread(my); Thread t2 = new Thread(my); t1.start(); t2.start();} }
一般使用实现 Runnable 接口
jvm 虚拟机的启动是单线程的还是多线程的?
是多线程的。不仅仅是启动 main 线程,还至少会启动垃圾回收线程的