线程和进程
470字约2分钟
2024-08-08
进程:进程是程序的一次执行过程,是系统运行程序的基本单位,包含一个或多个线程
线程:线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程
Java 真的可以开启线程吗?
不能,Thread.start()
最终调用的是本地方法,底层是 C++
,Java
无法直接操作硬件
// Thread 类
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
// 本地方法,底层 C++,Java 无法直接操作硬件
private native void start0();
并发和并行
并发:多线程操作同一个资源,假如
CPU
一核,模拟出多条线程,快速交替执行并行:
CPU
多核,多个线程可以同时执行
CPU 密集型,IO 密集型
public static void main(String[] args) {
// 获取 cpu 的核数
System.out.println(Runtime.getRuntime().availableProcessors());
}
并发编程本质:充分利用 CPU
资源
线程有几个状态
// Thread 类
public enum State {
// 创建
NEW,
// 运行
RUNNABLE,
// 阻塞
BLOCKED,
// 等待
WAITING,
// 超时等待
TIMED_WAITING,
// 终止
TERMINATED;
}
wait/sleep 区别
来自不同的类 | 锁的释放 | 使用范围 | 是否捕获异常 | 方法属性 | |
---|---|---|---|---|---|
wait | Object | 释放 | 必须在同步代码块中 | 需要 | 实例方法 |
sleep | Thread | 不释放 | 可以在任何地方 | 需要 | 静态方法 |