本文共 1994 字,大约阅读时间需要 6 分钟。
进程是程序的一次执行过程,是操作系统运行程序的基本单位。进程在创建、运行到终止的整个过程中,独占系统资源,如内存、CPU等。每个进程都有自己的虚拟地址空间、堆栈等资源。
在Java中,启动一个JVM时,主类的main方法会启动一个进程。这个进程中的线程称为主线程。我们可以通过任务管理器查看正在运行的进程列表。
线程是比进程更小的执行单位。一个进程可以产生多个线程,这些线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈。线程是轻量级进程,因其切换成本较低,被广泛用于并发编程。
Java程序天生支持多线程编程。通过JMX工具可以查看当前JVM中运行的线程信息。以下是获取所有线程信息的示例代码:
public class MultiThread { public static void main(String[] args) { ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false); for (ThreadInfo threadInfo : threadInfos) { System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName()); } }} 运行结果可能包括main线程和其他系统线程,如信号分发线程、最终化线程等。
从JVM角度看,一个进程可以包含多个线程。线程共享进程的堆和方法区资源,但有自己的程序计数器、虚拟机栈和本地方法栈。线程是进程划分成更小的执行单位的方式。
JVM的内存区域包括:堆、方法区(元空间)、虚拟机栈、本地方法栈、程序计数器。线程私有的是虚拟机栈和本地方法栈,共享的是堆和方法区。
并发可以利用多核CPU的优势,提升系统性能。
线程在生命周期中可能处于以下状态:
线程状态转换依赖于执行的操作,如wait()、sleep()、同步 BLOCK等。
上下文切换是操作系统为多线程任务轮转而执行的操作。每个线程切换到执行状态前,需要保存当前上下文(如程序计数器、寄存器等),切换到下一个线程后恢复原上下文。
上下文切换开销较大,会影响系统性能。
线程死锁是指多个线程在访问共享资源时发生互相等待的情况。四个必要条件:
常见解决方法:
wait()方法适合线程间通信,sleep()适合暂停执行。
调用start()方法才能让线程真正并发执行,直接调用run()方法会在主线程执行。
以上内容涵盖了Java并发编程的基础知识,适合作为面试准备或入门学习参考。
转载地址:http://iidbz.baihongyu.com/