先来一个图,eclipse里调试java程序,
程序具体功能可以忽略了,在main函数打一个断点,然后调试这个程序。
看到有一个Java Application在运行,名字和我们的类名相同,
看到运行了一个javaw.exe进程,同时windows任务管理器中可以看到,
然后看到调用堆栈,看到类(完整类名)被加载,有一个线程Thread [main]运行并暂停在之前设置断点的地方,
这里不打算深入研究jvm运行程序的过程,只是想说明一点,程序并不是直接在进程中运行的,而是在其中的某个线程里运行的。
java程序进程和线程的关系:
如果在eclipse里启动tomcat,就会有一个javaw.exe的进程,每个servlet请求到来就会有一个线程为他服务;
如果是控制台程序,就像我们最开始看到的,就会有一个javaw.exe进程,里面肯定有一个主线程在运行,后面还可能有别的线程同时运行;
如果是窗口程序,比如awt或swing,就可能有多个javaw.exe进程,可能一个窗口对应一个进程,每个窗口会有主线程和其它线程为他服务。
很明显的一点结论,一个进程里会有多个线程在运行。
为什么要有进程和线程呢?
一个程序对应一个进程,操作系统在同一时刻运行了多个程序,这样我们才能一边听歌,一边看网页,一边和朋友聊天等等;
一个线程对应程序里的一个子任务,一个程序需要同时做很多事情,播放选中的歌曲,显示对应的歌词,同时还能让我们去调整音量和播放进度等等;
进程和线程都能让我们并发的做一些事情,他们又各有什么优缺点呢?
进程的优点:
进程间相对独立,一般来说一个进程奔溃不会影响其它进程;
调度进程比较容易,一个进程可以创建其它进程,并且他们直接的耦合度比较低,进程空间都是独立的,并且父进程先退出子进程也可以运行;
横向扩展比较方便,比如tomcat集群,每个tomcat服务都是一个进程,需要增加整体性能时甚至不需要调整程序,只需要多复制一份tomcat服务并调整配置即可;
进程的缺点:
进程创建和维护消耗系统资源比较大;
进程间共享数据和通信的性能比较差,实现难度比较大;
线程的优点:
创建和维护线程消耗系统资源比较小;
线程间共享数据和通信的方式多、容易实现、性能好;
线程的缺点:
受限于所属进程的地址空间,横向扩展有一定限制;
稳定性差,一个线程奔溃可能导致整个进程崩溃,影响其它线程的运行;
线程调度相对复杂,需要考虑进程内部资源冲突的情况;