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 ~ 

    每天都要遇到更好的自己.
  • 相关阅读:
    Unity The Method Signature Matching Rule
    Unity The Property Matching Rule
    Unity The Type Matching Rule
    Unity The Custom Attribute Matching Rule
    Unity The Member Name Matching Rule
    Unity No Policies
    Unity The Return Type Matching Rule
    Unity The Parameter Type Matching Rule
    Unity The Namespace Matching Rule
    关于TSQL递归查询的(转)
  • 原文地址:https://www.cnblogs.com/kaichenkai/p/11798690.html
Copyright © 2011-2022 走看看