zoukankan      html  css  js  c++  java
  • 多线程(理论概述)

    【思维导图】

    【创建和启动】

    (1)方法一:继承Thread类创建线程类

    步骤:

    (i)定义Thread子类,并重写该类的run()方法。(PS:该run()方法的方法体就代表了线程需要完成的任务。因此run()方法也称为线程执行体)

    (ii)创建Thread子类的实例。即创建了线程的对象。

    (iii)调用线程对象的start()方法来启动该线程。

    (2)方法二:实现Runnable接口创建线程类

    步骤:

    (i)定义Runnable接口的实现类,并重写该接口的run()方法。该run()方法的方法体同样是该线程的线程执行体。

    (ii)创建Runnable实现类的实例。并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

    (iii)d调用线程对象的start()方法来启动该线程。

    (3)方法三:使用Callable和Future创建线程(从Java 5 开始)

    步骤:

    (i)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,且该call()方法有返回值,再创建Callable实现类的实例。(PS:Java8开始,可以用Lambda表达式创建Callable对象)

    (ii)使用FutureTask类来包装Callable对象,该Future对象封装了该Callable对象的call()方法的返回值。

    (iii)使用FutureTask对象作为Thread对象的target创建并启动新线程。

    (iv)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

    (4)创建线程的三种方法的对比

    继承Thread类:编写简单,可直接操作线程,适用于单继承。

    实现Runnable接口:避免单继承局限性,便于共享资源。

    【生命周期】

    新建:当程序使用new关键字创建了一个线程之后。

    就绪:当线程对象调用了start()方法之后。

    死亡状态:线程结束。有三种情况:

    (1)run()或call()方法执行结束,结束后就出于死亡状态。

    (2)线程抛出一个未捕获的Exception或Error。

    (3)直接调用该线程的stop()方法来结束该线程--该方法容易导致死锁,不推荐使用。

    【控制线程】

    1.join线程

    join()方法--让一个线程等待另一个线程完成的方法。

    2.后台线程

    有一种线程,它是在后台运行的,它的任务是为其他的线程提供服务。又称为“守护线程”或“精灵线程”。如:JVM的垃圾回收线程。

    3.线程睡眠--sleep

    让当前正在执行的线程暂停一段时间,并进入阻塞状态。

    方法:

    (1)static void sleep(long millis)

    (2)static void sleep(long millis,int nanos)

    4.线程让步--yield()

    让当前正在执行的线程暂停,并进入就绪状态。

    5.改变线程的优先级。

    setPriority()方法来设置优先级。

    每接触一个新领域,我就像一块掉进水里的海绵,四面八方的养分都让我不断充实。O(∩_∩)O~
  • 相关阅读:
    使用容器出现vector subscript out of range等类似错误
    string类库中的find和rfind函数
    Codeforces Round #181 (Div. 2)
    有关C++ int long最大表示长度问题
    js之京东商城分类导航效果
    JS之轮播图自动切换效果
    js之网页倒计时效果
    Js获取当前日期时间及其它操作
    js判断浏览器之事件绑定
    js之ajax实例
  • 原文地址:https://www.cnblogs.com/zhzcode/p/9695817.html
Copyright © 2011-2022 走看看