美文网首页
day11_面向对象_多线程

day11_面向对象_多线程

作者: 简单的书写点 | 来源:发表于2018-11-18 13:50 被阅读0次

    线程的定义

    在同一个进程内又可以执行多个任务,而这每一个任务我就可以看出是一个线程。
    线程:是程序的执行单元,执行路径。是程序使用CPU的最基本单位。
    单线程:如果程序只有一条执行路径。
    多线程:如果程序有多条执行路径。
    

    线程的意义

        多线程的存在,不是提高程序的执行速度。其实是为了提高应用程序的使用率。
    程序的执行其实都是在抢CPU的资源,CPU的执行权。
    多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到      CPU的执行权。就好像我雇了20个人帮我抽奖,我抽到奖的几率相对我一个人
    我们是不敢保证哪一个线程能够在哪个时刻抢到,所以线程的执行有随机性。
    

    并行和并发的区别

    并行:逻辑层面同时发生,指在一定时间内同时运行多个程序
    并发:物理层面同时发生,指在一个时间点同时运行多个程序
    JVM是多线程的,因为在程序运行的时候,除了主函数线程,至少还要有辣鸡回收这个线程。

    如何实现多线程

    首先,线程是依赖进程的,所以应该先创建一个进程出来
    而线程是由系统创建的,但是JAVA是不能直接调用系统功能的,所以我们需要调用C/C++写好的程序来实现多线程程序
    用C/C++调用系统功能创建进程,然后用JAVA去调用这样的东西,然后提供一些类(Thread)供我们使用,我们就可以实现多线程程序了

    实现多线程的方法

    创建新执行线有两种方法
    一种方法是将类声明为Thread的子类,即继承Thread类
    步骤:
    A:自定义类继承Thread类
    B:自定义类重写父类的run()方法,因为不是类中的所有方法都需要被线程执行,而这个时候,为了区分,用run()方法来包含那些需要被线程执行的代码。
    C:创建对象
    D:启动线程

    
    public class MyThread extends Thread{
            public void run(){
            for(int x=0;x<10;i++){
                System.out.println(x);
                }
            }
            public static void main(String[] agrs){
            MyThread  my = new MyThread();
            my.run();
            }
    }
    

    但是此时run()方法并不是多线程的,如果想要使用多线程的方式,则需要了解start()方法
    start()方法首先启动了线程,然后再由jvm去调用该线程的run()方法

    //创建两个线程对象
    MyThread my1 =new MyThread();
    MyThread my2 =new MyThread();
    my1.start();
    my2.start();
    
    但是这样的话,两个线程的输出都掺和在一起,无法分辨谁是谁,
    可以通过在MyThread中使用从Thread继承的getName()方法,在输出值之前标记getName(),默认输出Thread-加序号,序号是按照线程执行的先后定义的 ,但是也可以使用setName()方法给定线程一个名称。例如:
    

    public class MyThread extends Thread{
    public void run(){
    for(int x=0;x<10;i++){
    System.out.println(getName()+"---"+x);
    }
    }
    public static void main(String[] agrs){
    MyThread my = new MyThread();
    my.setName("王小帅");
    my.run();
    }
    }

    另一种方法是
    实现Runable接口
    步骤:
            A:自定义类MyThread实现Runnable接口
            B:重写run()方法
            C:创建MyRunnable类的对象
            D:创建Thread类的对象,并把C步骤的对象作为构造参数传递
    代码:
    

    package day12;

    public class MyRunnable implements Runnable {
    public void run() {
    for(int i=0;i<=100;i++) {
    System.out.println(Thread.currentThread().getName()+":"+i);
    }
    }
    }

    package day12;

    public class MyRunnableDemo {
    public static void main(String[] args) {
    //创建MyRunnable类的对象
    MyRunnable my = new MyRunnable();
    //创建Thread类的对象,并把C步骤的对象作为构造函数参数传递
    Thread t1 =new Thread(my);
    Thread t2 =new Thread(my);
    t1.setName("零直选");
    t2.setName("左丘明");
    t1.start();
    t2.start();
    }
    }

    
    ####多线程两种方式的图解比较和区别
    ![如图](https://img.haomeiwen.com/i14378624/3b8889bd7d6491ec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    
    
    ####线程调度
    #####线程休眠
    
    public static void sleep(long millis)
    参数为毫秒
    线程休眠需要异常处理
    
    #####加入线程
    public final void join():等待该线程终止后其他线程再执行
    #####礼让线程
    public static void yield():暂停当前正在执行的线程对象,并执行其他线程
    让多个线程的执行更和谐,并不能靠他保证一人一次
    
    ####线程的生命周期
    ![线程的生命周期](https://img.haomeiwen.com/i14378624/df7f95e824317dc2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    
    
    
    
    
    
    
    

    相关文章

      网友评论

          本文标题:day11_面向对象_多线程

          本文链接:https://www.haomeiwen.com/subject/adtgfqtx.html