zoukankan      html  css  js  c++  java
  • Java学习:线程实现方式

    线程实现方式

    并发与并行

    • 并发:指两或多个事件在同一个时间段内发生
    • 并行:指两或多个事件在同一个时刻发生(同时发生)

    进程的概念

    内存:所有的应用程序都需要进入到内存中执行 临时存储RAM

    硬盘:永久存储ROM

    • 进入到内存的程序叫进程
    • 任务管理器-->结束进程
    • 那么就把进程从内存中清除了

    线程的概念

    点击一个应用程序的功能执行,就会开启一条应用程序到cpu的执行路径,cup就可以通过这个路径执行功能,这个路径有一个名字,叫线程。

    线程属于进程:是进程中的一个执行单元,负责程序的执行

    线程的好处:

    1. 效率高
    2. 多线程之间互不影响

    如:
    单核心线程cpu

    • cpu在多个线程之间做高速的切换
    • 轮流执行多个线程
    • 效率低
    • 切换的速度块(1/n毫秒)

    4核心8线程

    • 有8个线程,可以同时执行8个线程
    • 8个线程在多个任务之间做高速的切换
    • 速度是单线程cpu的8倍(每个执行到的几率都被提高了8倍)

    线程的调度

    分时调度

    • 所有线程轮流使用cpu的使用权

    抢占式调度

    • 优先级高的线程使用cpu先使用,若相同,随机选择一个。Java使用的就是抢占式调度。

    主线程

    主线程:执行主(main)方法的线程

    单线程程序:Java程序中只有一个线程
    执行从main方法开始,从上到下依次执行

    • JVM执行main方法,main方法会进入到栈内存
    • JVM会找操作系统开辟一条main方法通向cpu的执行路径
    • cpu就可以通过这个路径来执行main方法
    • 而这个路径有一个名字,叫main(主)线程

    创建多线程

    创建多线程程序的第一种方式:创建Thread的子类
    java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类。

    实现步骤:

    1. 创建一个Thread类的子类
    2. 在Thread类的子类中重写Thread类的run方法,设置线程任务(开启线程要做什么?)
    3. 创建Thread类的子类对象
    4. 调用Thread类中的方法start方法,开启新的线程,执行run方法。
    • void start() 使该线程开始执行;Java虚拟机调用该线程的run方法。
    • 结果是两个线程并发地运行;当前线程(main线程)和另一个线程(创建地新线程,执行其run方法)。
    • 多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。

    Java使用的就是抢占式调度。优先级高的线程使用cpu先使用,若相同,随机选择一个。

    //1.创建一个Thread类的子类
    public class MyThread extends Thread{
        //2.在Thread类的子类中重写Thread类的run方法,设置线程任务(开启线程要做什么?)
        @Override
        public void run(){
            for (int i = 0;i<20;i++){
                System.out.println("run:"+1);
            }
        }
    }
        
    public class CaiNiao{
        public static void main(String[] args){
            //3 创建Thread类的子类对象
            MyThread mt = new MyThread();
            //4.调用Thread类中的方法start方法,开启新的线程,执行run方法。
            mt.start();
        
            //主线程会继续执行主方法中的代码
            for (int i = 0;i<37;i++){
                System.out.println("main:"+i);
            }
        
        }
    }

    创建多线程程序的第二种方法:实现Runnable接口
    java.lang.Runnable

    • Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run的无参数方法。

    java.lang.Thread类的构造方法

    • Thread(Runnable target)分配新的 Thread对象。
    • Thread(Runnable target,String name)分配新的 Thread对象。

    实现步骤:

    1. 创建一个Runnable接口的实现类
    2. 在实现类中重写Runnable接口的run方法,设置线程任务
    3. 创建一个Runnable 接口的实现类对象
    4. 创建Thread类对象,构造方法中传递Runnable接口的实现类对象
    5. 调用Thread类中的方法start方法,开启新的线程,执行run方法。

    实现Runnable接口创建多线程程序的好处:
    1 避免了单继承的局限性

    • 一个类只能继承一个类(一个人只能有一个亲爹),类继承了Thread类就不能继承其他的类
    • 实现Runnable接口,还可以继承其他的类,实现其他的接口

    2 增强了程序的扩展性,降低了程序的耦合性(解耦)

    • 实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
    • 实现类中,重写了run方法:用来设置线程任务
    • 创建Thread类对象,调用Thread类中的方法start方法,开启新的线程,执行run方法。

    匿名内部类方式实现线程的创建

    • 匿名:没有名字
    • 内部类:写在其他类内部的类

    匿名内部类的作用:简化代码

    • 把子类继承父类,重写父类的方法,创建子类对象合一步完成
    • 把实现类实现类接口,重写接口中的方法,创建实现类对象合一步完成

    格式:

    new 父类/接口(){
        重置父类/接口中的方法
    };
    
    //线程的父类是Thread
    //new MyThread().start();
    
    //线程的接口Runnable
    //Runnable r = RunnableTmpl();//多态
    //new Runnable(r).start();

    Thread类的常用方法
    获取线程的名称:

    1. 使用Thread类中的方法getName() 返回该线程的名称。
    2. static Thread currentThread() 返回对当前正在执行的线程对象的引用。

    设置线程的名称:

    1. 使用Thread类中的方法setName(名字)
    2. void setName(String name) 改变线程的名称,使之参数 name相同。
    • public void start():使该线程开始执行;Java虚拟机调用该线程的run方法
    • public void run():此线程要执行的任务在此处定义代码
    • public static void sleep(long millis):使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
  • 相关阅读:
    Android Studio 开发
    Jsp编写的页面如何适应手机浏览器页面
    电影
    Oracle 拆分列为多行 Splitting string into multiple rows in Oracle
    sql server 2008 自动备份
    WINGIDE 激活失败
    python安装 错误 “User installations are disabled via policy on the machine”
    ble编程-外设发送数据到中心
    iOS开发-NSString去掉所有换行及空格
    ios9 字符串与UTF-8 互相转换
  • 原文地址:https://www.cnblogs.com/cainiao-chuanqi/p/11285428.html
Copyright © 2011-2022 走看看