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 ~ 

每天都要遇到更好的自己.
原文地址:https://www.cnblogs.com/kaichenkai/p/11798690.html