进程和线程
- 进程
进程是一个程序的集合。比如运行中的QQ
、微信
等,在运行时,就存在进程。
一个进程,可以包含多个线程。(一个进程至少包含一个线程。)
- 线程
在一个应用中,程序执行流的最小单元。
上面的说法过于抽象,举个栗子:
火车 == 进程
车厢 == 线程火车和火车是不同的进程。
但是一列火车,可以包含多个车厢。
Java中有几个线程?
默认两个。
一个是主线程(如main()),一个是jvm的GC垃圾收集线程。
Java 可以开启线程?
无法开启。
new Thread().start();执行,在于源码中调用了start0();其是一个C++代码逻辑,并非是Java本身。
private native void start0();
并发和并行
- 并发
多线程操作同一个资源。比如:抢票。 - 并行(CPU多核才有)
线程和线程之间,可以同时进行。(两列并行的火车)
线程的状态
在java中的java.lang.Thread.State
中,针对状态值做了以下定义:
public enum State {
// 新生
NEW,
// 运行
RUNNABLE,
//阻塞
BLOCKED,
//等待(死等)
WAITING,
//超时等待(期限等待)
TIMED_WAITING,
// 终止、消亡
TERMINATED;
}
wait()、sleep()的区别
- 来源于不同的类
wait()来源于Object类,sleep()来源于线程类。
- 关于锁的释放
wait()会释放锁、sleep()不会释放 - 使用范围不同
wait():必须在同步代码块
中使用。
sleep():无范围限制。任何地方都可以。
TimeUnit.SECONDS.sleep(1);
- 关于异常捕获
sleep 需要捕获异常。
wait 也需要捕获异常。