zoukankan      html  css  js  c++  java
  • Java 多线程

    进程与线程

    进程: 指在内存中运行的应用程序, 每个进程在内存里拥有自己的内存空间

    线程: 线程是进程中的执行单元, 负责当前进程中程序的执行(真正干事的是线程)

    简而言之: 一个应用程序运行后至少有一个进程, 一个进程可以包含多个线程

    并发与并行: 

    • 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)

    • 并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的

    Thread 类

    java 虚拟机允许应用程序并发地运行多个线程(真的多线程, 与 py 不同)

    java 线程属于抢占式调度, 哪个线程的优先级高, 哪个线程优先执行, 同一个优先级, 随机执行

    多个线程之间互不影响 (???这里还不够具体)

     

    创建线程的两种方法: 

    1. 创建 Thread 子类, 重写 run 方法

    2. 实现 Runnable 接口的类, 然后实现 run 方法

    demo: 

    public class Main {
        public static void main(String[] args) {
            MyTread mt1 = new MyTread();
            mt1.start();
    
            for (int i=1; i<=20; i++) {
                System.out.println("main" + i);
            }
        }
    }
    
    class MyTread extends Thread {
        @Override
        public void run(){
            for (int i=0; i<20; i++) {
                System.out.println("run" + i);
            }
        }
    }

    获取/设置线程名称

    获取名称: 

    1. String getName(): 返回该线程的名称

    2. static Thread currentThread(): 返回当前正在执行的线程对象的引用

    设置名称: 

    1. void setName(String name): 改变线程名称

    2. Thread(String name): 调用父类的构造方法 , 传入线程名称

    获取名称: 

    public class Main {
        public static void main(String[] args) {
            MyTread mt1 = new MyTread();
            mt1.start();
            System.out.println("name: " + Thread.currentThread().getName());
        }
    }
    
    class MyTread extends Thread {
        @Override
        public void run(){
            System.out.println("name: "+ Thread.currentThread().getName());
        }
    }
    
    运行结果:
    name: main
    name: Thread-0

    设置名称: 

    public class Main {
        public static void main(String[] args) {
            MyTread mt1 = new MyTread();
            System.out.println(mt1.getName());
            mt1.start();
    
            // 更改线程名称
            mt1.setName("打印线程222222");
            System.out.println(mt1.getName());
        }
    }
    
    class MyTread extends Thread {
        public MyTread(){
            super("打印线程1");
        }
    
        @Override
        public void run(){}
    }
    
    运行结果: 
    打印线程1
    打印线程222222

    Thread 类 和 Runnable 接口的区别

    实现 Runnable 接口, 开启多线程:

    public class Main {
        public static void main(String[] args) {
            // 创建一个 Runnable 接口的实现类对象
            RunnableImpl run = new RunnableImpl();
            // 创建 Thread 类对象, 构造方法中传入 Runnable 实现类对象
            Thread mt = new Thread(run);
            mt.start();
        }
    }
    
    
    class RunnableImpl implements Runnable{
        @Override
        public void run(){
            System.out.println(Thread.currentThread().getName());
        }
    }

    实现 Runnable 接口创建多线程的优点:

    1. 一个类只能继承一个类, 而一个类可以实现多个接口(实现了 Runnable 接口, 还能实现其它的接口 , 继承其它的类)

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

      实现 Runnable 接口的方式, 把设置线程任务和开启新线程进行了分离

      实现类中, 重写了 run 方法: 用来设置线程任务

      创建 Thread 类对象, 传入 run 方法, 开启线程

    ending ~ 

    每天都要遇到更好的自己.
  • 相关阅读:
    TCP 协议如何保证可靠传输
    mysql 优化
    Navicat 导入导出
    Hibernate的优缺点
    寒假学习日报(十八)
    《机器学习十讲》第二讲总结
    寒假学习日报(十七)
    《设计原本》阅读笔记(二)
    《机器学习十讲》第一讲总结
    寒假学习日报(十六)
  • 原文地址:https://www.cnblogs.com/kaichenkai/p/11798690.html
Copyright © 2011-2022 走看看