多线程基础概念与认识

Posted 烟锁迷城

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程基础概念与认识相关的知识,希望对你有一定的参考价值。

1、进程与线程

1.1、进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。线程是进程的最小单位,一个进程有多个线程组成,它至少包含一个线程。

  1. 对于单核CPU而言,多线程就是不断分配时间片来切换线程。
  2. 对于多核CPU而言,多线程就是多核心并行执行,每一个核心处理一个线程。

1.2、线程

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

  1. 在多核CPU中,利用多线程可以实现真正意义上的并行执行
  2. 在一个应用进程中,会存在多个同时执行的任务,如果其中一个任务被阻塞,将会引起不依赖该任务的任务也被阻塞,通过对不同任务创建不同的线程去处理,可以提升程序处理的实时性。
  3. 线程可以认为是轻量级的进程,所以线程的创建、销毁比进程更快

1.3、多线程

多线程可以有效的提升程序运行的效率,在JAVA中是一种非常常用的编程方法

  1. 实现异步执行
  2. 利用多CPU资源实现真正意义上的并行执行

1.4、应用场景

多线程应用场景

  1. 使用多线程实现文件下载
  2. 后台任务,如发送邮件,短信
  3. 异步处理,如日志记录
  4. 多步骤的任务处理,可根据步骤特征选用不同个数和特征的线程来协作处理,多任务的分割,由一个主线程分割给多个线程完成

2、具体实现

2.1、thread类

线程可以通过继承thread类,重写run方法,用start方法来进行调用。

public class ThreadDemo extends Thread{

    @Override
    public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("thread show");
    }

    public static void main(String[] args) {
        ThreadDemo threadDemo = new ThreadDemo();
        threadDemo.start();
        System.out.println("main show");
    }
}

2.1、runnable接口

实现Runnable接口后,重写run方法,用tread类的start方法进行调用

public class RunnableDemo implements Runnable {
    @Override
    public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("thread show");
    }

    public static void main(String[] args) {
        RunnableDemo runnableDemo = new RunnableDemo();
        new Thread(runnableDemo).start();
        System.out.println("main show");
    }
}

2.3、Callable接口

实现Callable接口,重写call方法,可以实现有返回值的线程,但是要注意,这里future的get方法是阻塞的,因为需要返回值。

import java.util.concurrent.*;

public class CallableDemo implements Callable<String> {

    @Override
    public String call() throws Exception {
        Thread.sleep(2000);
        return "callable show";
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(1);
        CallableDemo callableDemo = new CallableDemo();
        Future<String> future = executorService.submit(callableDemo);
        System.out.println(future.get());
        System.out.println("main show");
    }
}

3、生命周期

java线程有六种状态,分别是new(创建),runnable(运行),time_waiting(超时等待),waiting(等待),blocked(阻塞),terminated(死亡)。
系统线程的五种状态,分别是新生,就绪(ready),运行(running),等待(waiting),死亡。

  1. 一个线程先被创建,然后进入运行(分为就绪,运行两种)状态
  2. 加锁(synchronized修饰)会进入阻塞状态
  3. 使用不带等待时间的等待函数sleep(0),wait(),join(),LockSupport.park()会进入等待状态
  4. 使用加入唤醒时间的等待函数sleep(time),wait(time),join(time),LockSupport.parkUntil(time)会进入超时等待状态
  5. notify(),notifyall(),LockSupport.unpark()可以唤醒沉睡中的线程,使之进入运行(分为就绪,运行两种)状态
  6. run函数运行结束后,线程进入死亡状态。

在这里插入图片描述

以上是关于多线程基础概念与认识的主要内容,如果未能解决你的问题,请参考以下文章

多线程认识多线程

详细讲解 —— 多线程初阶认识线程(Java EE初阶)

JavaWeb 基础知识——线程01

JavaWeb 基础知识——线程01

认识多线程

认识cpu核与线程