栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多线程与高并发

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多线程与高并发

名词解释: 进程与线程
  • 进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。进程相当于程序的一次运行,线程依赖于进程,不可肚子存在。
    一个线程的生命周期:

  • 线程的优先级:
    每一个 Java 线程都有一个优先级,这样有助于操作系统确定线程的调度顺序。
    Java 线程的优先级是一个整数,其取值范围是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。
    默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。
    具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源。但是,线程优先级不能保证线程执行的顺序,而且非常依赖于平台,具有高优先级只是被执行的概率更高,并非一定被执行。

并发与并行
  • 并行(parallel): 指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
  • 并发(concurrency): 指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
  • 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
  • 并行是在多台处理器上同时处理多个任务。如 hadoop 分布式集群,并发是在一台处理器上“同时”(同一时间间隔)处理多个任务。
同步与异步
  • 同步和异步通常用来形容一次方法调用,强调的是消息通信机制。

  • 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。同步主要用于上下有递进关系的代码,特点是有序,串行执行,逻辑简单,但是执行效率较低。

  • 异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而,异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。异步在java里面主要使用线程(包括一些封装类也是如此)实现,特点是执行效率高,但是逻辑相对复杂,容易出问题。

阻塞与非阻塞
  • 阻塞和非阻塞多用来形容线程,与线程等待消息通知(无所谓同步或者异步)时的状态有关。阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
  • 注意区分同步与异步、阻塞与非阻塞,一个是消息通信机制,一个是线程状态;在不同场景下,同步阻塞、同步非阻塞、异步阻塞、异步非阻塞这四种组合都有应用。
线程的实现方法

java提供了三种创建线程的方法

  1. 继承Thread类;
  2. 实现Runnable接口;
  3. 实现Callable接口。
继承Thread类

继承Thread之后,要实现父类的run方法,然后在起线程的时候,调用其start方法。

  • 注意start和run方法的区别:

    start:用start方法来启动线程,真正实现了多线程运行,通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行任务;
    run: run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

    如下图,通过debug可以看出,start方法比run方法多一个线程

实现Runnable接口

实现Runnable接口的run方法,在起线程的时候,如下,new一个Thread类,然后把类当做参数传进去。

在java中,Thread类也是通过实现Runnable接口实现的:

  • Runnable接口与Thread类选择:
    1. java是单继承多实现,从这方面来说,Runnable接口的可拓展性高于Thread类;
    2. Thread类每次执行任务,都需要new一个Thread,而Runnable是作为参数,直接把任务传入线程池,不需要每次新建销毁现场,大大降低了性能开销;
    3. Runnable接口中只有一个run方法,而Thread类可设置属性、启动线程等。
实现Callable接口

Callable和Runnable可以认为是兄弟关系,两者功能类似:

  • Callable与Runnable
    1. Callable实现call方法,Runnable实现run方法;
    2. Callable有返回值(运行Callable任务可拿到一个Future对象, Future表示异步计算的结果),Runnable无返回值;
    3. Callable需要处理异常,Runnable不需要
  • Future接口的5个方法:
    1. boolean cancel(boolean mayInterruptIfRunning)
      用于取消任务,取消成功返回true,否则false;mayInterruptIfRunning指是否允许取消正在运行但未执行完毕的任务;

    2. boolean isCancelled()

      若在Callable任务正常完成前被取消,返回True;

    3. boolean isDone()

      若Callable任务完成,返回True;

    4. V get() throws InterruptedException, ExecutionException

      返回Callable里call()方法的返回值,调用这个方法会导致程序阻塞,必须等到子线程结束后才会得到返回值;

    5. V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException

      用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/667110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号