Java多线程

Java多线程

Java多线程

什么是多线程

就是多个任务同时执行,比如 我可以边吃饭边看电视并且还可以玩手机,就是在同一时间可以同时处理多个事情,这就是多线程

讲多线程前必须先了解线程进程这两者之间的关系

进程

在计算机中,我们把一个任务称为一个进程,比如浏览器,微信 qq 这个都是一个进程

**维基百科:**进程(英语:process),是指计算机中已运行的程序,用户下达运行程序的命令后,就会产生进程。同一程序可产生多个进程(一对多关系),以允许同时有多位用户运行同一程序,却不会相冲突。
进程需要一些资源才能完成工作,如CPU使用时间、存储器、文件以及I/O设备,且为依序逐一进行,也就是每个CPU核心任何时间内仅能运行一项进程

线程

线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程

维基百科: 线程(英语:thread)是操作系统能够进行运算调度的最小单位

Java中如何创建多线程

在java中有以下方式创建多线程

  • 继承Thread类重写run方法 (不建议使用,避免OOP单继承局限性)
// myThread.java
public class MyThread extends Thread{
    @Override
    public void run() {
        super.run();
        System.out.println("子线程处理线程数据");
    }
}
    
// 测试方法类 TestApp.java
public class TestApp{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        // 启动线程
        myThread.start();
        System.out.println("主线程处理数据");
    }
}
  • 实现Runnable接口(推荐方式,方便同一个对象别多个线程使用)
// RunnableImpl.java
public class RunnableImpl implements Runnable {

    @Override
    public void run() {
        System.out.println("子线程处理数据");
    }
}

// 测试方法类 TestApp.java
public class TestApp{
    public static void main(String[] args){
        RunnableImpl runnableImpl = new RunnableImpl();
        // 启动线程
        new Thread(runnableImpl).start();
        System.out.println("主线程处理数据");
    }
} 
  • 实现Callable接口(支持返回值)
// CallableImpl.java
public class CallableImpl implements Callable<String> {

    @Override
    public String call() {
        System.out.println("子线程处理数据");
        return "";
    }
}

// 测试方法类 TestApp.java
public class TestApp{
    public static void main(String[] args){
        // 创建执行服务
        ExecutorService executorsSer = Executors.newFixedThreadPool(1);
        // 提交执行
        Future<String> res  = executorsSer.submit(new CallableImpl());
        // 获取结果
        res.get();
        // 关闭服务
        executorsSer.shutdown();
        System.out.println("主线程处理数据");
    }
} 

线程生命周期

新建状态(New)

当使用new关键字创建一个线程后,仅仅由Java虚拟机为其分配内存,并初始化其成员变量的值,程序不会执行线程的线程执行体

public class Main {
    public static void main(String[] args) {
        // 创建线程
        Thread t = new Thread(() -> {
            System.out.println("子线程处理数据");
        });
    }
}

就绪状态(Runnable)

public class Main {
    public static void main(String[] args) {
        // 创建线程
        Thread t = new Thread(() -> {
            System.out.println("子线程处理数据");
        });
        // 运行
        t.start();
    }
}

运行状态(Running)

public class Main {
    public static void main(String[] args) {
        // 创建线程
        Thread t = new Thread(() -> {
            System.out.println("子线程处理数据");
        });
        // 运行
        t.start();
    }
}

阻塞状态(Blocked)

public class Main {
    public static void main(String[] args) {
        // 创建线程
        Thread t = new Thread(() -> {
            // 睡眠
            Thread.sleep(50);
            System.out.println("子线程处理数据");
        });
        // 运行
        t.start();
    }
}

死亡状态(Terminated)

线程执行完成就进行死亡状态(Terminated)