黑马程序员----java基础----多线程

佐手、 提交于 2020-03-06 18:44:28

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、理解线程

  进程:每个独立执行的程序称之为进程。

  线程:线程就是一个进程内部的一条执行路径。

  多线程:在java虚拟机启动的时候会有一个java.exe的执行程序,也就是一个进程。该进程中至少有一个线程负责java程序的执行。而且这个线程运行的代码存在于main方法中。该线程称之为主线程。JVM启动除了执行一个主线程,还有负责垃圾回收机制的线程。像种在一个进程中有多个线程执行的方式,就叫做多线程。

  线程和多线程区别如下:

    (1)每个进程都有独立的代码和数据空间,进程间的切换开销大。

    (2)同一进程内的多个线程共享相同的代码,每个线程有独立的运行栈和程序计数器,线程间的切换开销小。

二、创建线程的方式

  创建线程共有两种方式:继承方式和实现方式(简单的说)。

    1、 继承方式

      通过查找java的帮助文档API,我们发现java中已经提供了对线程这类事物的描述的类——Thread类。这第一种方式就是通过继承Thread类,然后复写其run方法的方式来创建线程。

    创建步骤:

    (1),定义类继承Thread

    (2),复写Thread中的run方法。

    目的:将自定义代码存储在run方法中,让线程运行。

    (3),创建定义类的实例对象。相当于创建一个线程。

    (4),用该对象调用线程的start方法。该方法的作用是:启动线程,调用run方法。

      注:如果对象直接调用run方法,等同于只有一个线程在执行,自定义的线程并没有启动。

    Thread类用于描述线程。该类就定义了一个功能,用于存储线程要执行的代码。该存储功能就run方法。也就是说,Thread类中的run方法,用于存储线程要运行的代码。

   程序示例:

class MyThread extends Thread{    // 继承Thread类,作为线程的实现类
    private String name ;        // 表示线程的名称
    public MyThread(String name){
        this.name = name ;        // 通过构造方法配置name属性
    }
    public void run(){    // 覆写run()方法,作为线程 的操作主体
        for(int i=0;i<10;i++){
            System.out.println(name + "运行,i = " + i) ;
        }
    }
};
public class ThreadDemo01{
    public static void main(String args[]){
        MyThread mt1 = new MyThread("线程A ") ;     // 实例化对象
        MyThread mt2 = new MyThread("线程B ") ;     // 实例化对象
        mt1.run() ;    // 调用线程主体
        mt2.run() ;    // 调用线程主体
    }
};

    执行结果如下:

  

  从此处的效果来看,确定是并发执行的,那个线程抢占到了CPU资源,那个线程就执行。

三、线程的生命周期

  

四、线程的几种状态

  被创建:等待启动,调用start启动。

  运行状态:具有执行资格和执行权。

  临时状态(阻塞):有执行资格,但是没有执行权。

  冻结状态:遇到sleeptime)方法和wait()方法时,失去执行资格和执行权,sleep方法时间到或者调用notify()方法时,获得执行资格,变为临时状态。

  消忙状态:stop()方法,或者run方法结束。

  注:当已经从创建状态到了运行状态,再次调用start()方法时,就失去意义了,java运行时会提示线程状态异常。

  如图:

五、总结

  1.进程与线程的区别。

    线程是在进程的基础上划分的。

    线程消失了进程不会消失,进程如果消失了,则线程肯定会消失。

  2.java进程实现的两种方式

    继承thread

    实现Runnable接口

  3.线程的启动:通过start()方法完成,需要进行cpu调度,调用state()实际上调用的就是润()方法

  4.Thread类也是runnable的子类,实用了代理的机制完成。

  5.在实用多线程的实现中建议通过rennable接口实现,这样可以避免由于但继承所带来的开发局限,而且通过是使用Runnable接口也可已达到资源共享的目的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!