java中程序,进程和线程的区别

程序,进程和线程的区别
马克-to-win:程序,进程和线程的区别是什么?这个问题比较抽象难理解,但又非常重要。我并不想给出一大堆抽象的学术解释,那样只能误国误民。所以我先给大家举一个例子。马克-to-win: 2000年的时候,我比较爱用ie的老版本。当时我喜欢边上网边下载很多东西,比如很多MP3同时下。我发觉如果我打开一个ie,之后用 file/new,new出很多窗口来,边看网页,边下载很多mp3的话,如果有一个下载崩溃的话,所有的ie窗口就同时都崩溃了,包括网页和所有的下载窗口。马克-to-win:后来我就学聪明了,我打开两个ie。一个ie用来浏览网页。另一个ie,file/new出很多新的窗口。这样如果下载出问题了,下载的ie会崩溃。但浏览网页的ie依旧完好的工作。在上述例子当中,ie就是一个应用程序,后来我打开两个ie,就是打开两个进程。这两个进程,在内存中分别占有不同的代码空间。马克-to-win:所以一个进程崩溃不影响另外一个。后来从其中一个ie, file/new出很多个新窗口。每一个窗口就是一个线程,线程在内存当中是没有自己的代码空间的。它只能依附于进程存在。马克-to-win:所以,这个进程当中的一个线程窗口崩溃了,所有依附于这个进程的线程窗口就都崩溃了。相对于进程来讲,线程非常轻量,非常节省资源。我经常同时打开二十个窗口,下载各种音乐mp3。反正是线程,不占资源。马克-to-win:线程在内存当中没有自己的代码空间。只有程序计数器。一个线程可能执行到所依附进程的1000行,另一个线程,可能执行到第99行,这两个线程,虽然依附于同一个主进程,但他们各自执行各自的,相互不影响。马克-to-win:仔细揣摩我上面说的故事,你就会理解,程序,进程和线程的区别。给点抽象的话:程序是硬盘上的一个文件,是一个机器代码和它的数据的集合。进程是程序在内存上的一次运行活动,占代码空间。线程是依附于进程,靠程序计数器能独立运行,轻量独立运行单元。


马克- to-win:马克 java社区:防盗版实名手机尾号: 73203。

线程间(因为使用程序计数器)的切换成本比进程间切换成本低,所以使系统的空转时间少,提高CPU利用率。
3.线程技术基础
主线程
马克-to-win:根据java的语法(sun公司当初就是这么设计的):在Java程序启动时,一个线程立刻运行,该线程通常称为程序的主线程(main thread) 。 主线程的重要性体现在两个方面: 它是产生其他子线程的线程。 通常它必须最后完成执行,因为它执行各种关闭动作。我们从第一章helloworld开始,其实就已经创建了主线程,只不过我们没有着重提。现在我们研究一下:







例:1.3.1-本章源码
public class Test {
    public static void main(String args[]) {
/*Thread.currentThread();把当前的线程参数取回来, 放在t中, 当前的线程其实就是主线程,线程参数包括线程名称,程序计数器等*/
        Thread t = Thread.currentThread();
/*打印的结果是线程名称,优先级, 线程组。
 public String toString()Returns a string representation of this
thread, including the thread's name, priority, and thread group.
*/
        System.out.println("当前线程是: " + t);
/*改变了主线程的名字*/
        t.setName("马克-to-win的线程");
        System.out.println("当前线程名是: " + t);
    }
}

输出结果:
当前线程是: Thread[main,5,main]
当前线程名是: Thread[马克-to-win的线程,5,main]