毕向东讲解(摘)—1.多线程概述

来源:互联网 发布:美国非农数据直播间 编辑:程序博客网 时间:2024/05/17 01:37

进程:是一个正在执行中的程序。

每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。

线程:就是进程中的一个独立的控制单元。

线程就是在控制着进程的执行。

 

一个进程中至少有一个线程。

 

 

Java VM 启动的时候会有一个进程  java.exe

 

该进程中至少有一个线程负责java程序的执行。

而且这个线程运行的代码存在于main方法中。

该线程称之为主线程。

 

拓展:

在我们接触线程不深的时候,我们觉得JVM的启动貌似是单线程的,我们主观的感受只有main函数在执行,但是其实不然,因为我们知道java有自己的垃圾回收机制,其实在虚拟机启动的时候,垃圾回收机制就自动的启动运行了,所以其实在虚拟机运行这个进程中至少有两个及以上的线程。

还有类似Thunder 一样的P2P软件,他们是多线程最好的代表,因为他们在启动下载的时候,不会只从一台服务器上下载资源,他们会从多台服务器上下载资源的不同部分。所以必然是多线程的。

 

多线程的意义:

让我们的程序产生同时运行的效果;

或许大家会问多线程有什么意义

例如:

比如JVM中利用多线程实现垃圾回收机制同时运行

按理说我们可以让执行main函数的主线程进行垃圾回收,然后可以让线程保持在一个,就不用考虑多线程的问题了。但是这里就能凸显出多线程的好处,试想如果只有一个线程的话,管理main的主线程,在发现程序执行过程中,垃圾将内存空间占满了,就要停止执行程序,倒过来从头执行垃圾回收,这样显得就不够合理了。

相反,将垃圾回收的程序分离出来,形成一个新的线程,和主线程形成多线程,执行一次清理一次,就显得要合理的多。



多线程图解  一个线程要经历的生命周期:从被创建 到运行  到冻结 到消亡  期中还有一个不明确但一直存在的状态  就是阻塞

 

通过继承Thread类之后的线程实现类或者直接new一个Thread对象,可以完成一个线程对象的创建。

每个线程在new对象的时候,就会有自己的名称和标识符:Thread自己提供的方法有getName、setName、getId(但是没有setId:因为要保证标识符唯一)

如果没有用setName进行修改线程的名字的话,默认的是以:Thread-*来表示的,例如:

Thread-0、Thread-1、Thread-2  ... ...

Thread中提供了静态的currentThread();    方法


package day2;

 

publicclassTest2{

    publicstaticvoidmain(String[]args){

       MyThread1m=newMyThread1("mzy");

       m.start();

    }

}

 

classMyThread1extendsThread{

    // private String name;

    MyThread1(){}

    MyThread1(Stringname){

       super(name);

    }

    publicvoidrun(){

       //通过使用super父类引用来调用父类中的getName可以

       System.out.println(super.getName()+"在运行");

       //通过使用this当前对象来调用父类中的getName也可以

       System.out.println(this.getName()+"在运行");

       /**

        *  因为currentThread的作用就是利用静态类名直接返回当前对象的引用

        *  所以其实通过super、通过this或者是通过static的currentThread

        *  得到父类中的对象的引用其实都是一个对象,所以最后的返回值为true

        *  但是使用this.getName();不是通用的方式,但是通过                    * Thread.currentThread().getName();

        *  进行调用的话,就是通用的方式,也是最标准的方式

        * 

        */

       System.out.println(Thread.currentThread().getName());

                        System.out.println((Thread.currentThread()==this)+"..."+this.getName   ()+"\trun...");

      

    }

}

 

 


原创粉丝点击