国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

多線程 start 和 run 方法到底有什么區別?

SoapEye / 336人閱讀

摘要:昨天棧長介紹了多線程可以分組,還能這樣玩線程分組的妙用。今天,棧長會詳細介紹中的多線程和兩個方法,老司機請跳過,新手或者對這兩個不是很理解的可以繼續往下看。

昨天棧長介紹了《Java多線程可以分組,還能這樣玩!》線程分組的妙用。今天,棧長會詳細介紹 Java 中的多線程 start() 和 run() 兩個方法,Java 老司機請跳過,新手或者對這兩個不是很理解的可以繼續往下看。

首先要知道實現多線程最基本的兩種方式:

1、繼承 java.lang.Thread 類;

2、實現 java.lang.Runnable接口;

其中 Thread 類也是實現了 Runnable 接口,而 Runnable 接口定義了唯一的一個 run() 方法,所以基于 Thread 和 Runnable 創建多線程都需要實現 run() 方法,是多線程真正運行的主方法。

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

而 start() 方法則是 Thread 類的方法,用來異步啟動一個線程,然后主線程立刻返回。該啟動的線程不會馬上運行,會放到等待隊列中等待 CPU 調度,只有線程真正被 CPU 調度時才會調用 run() 方法執行。

所以 start() 方法只是標識線程為就緒狀態的一個附加方法,以下 start() 方法的源碼,其中 start0() 是一個本地 native 方法。

public synchronized void start() {
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

    group.add(this);

    boolean started = false;
    try {
        start0();
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
            /* do nothing. If start0 threw a Throwable then
              it will be passed up the call stack */
        }
    }
}

請注意,start() 方法被標識為 synchronized 的,即為了防止被多次啟動的一個同步操作。

那么你會問了,為什么要有兩個方法,直接用一個 run() 方法不就行了嗎!? 還真不行,如果直接調用 run() 方法,那就等于調用了一個普通的同步方法,達不到多線程運行的異步執行,來看下面的例子。

/**
 * 微信公眾號:Java技術棧
 */
public static void main(String[] args) {
    Thread thread = new Thread(() -> {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Java技術棧");
    });

    long start = System.currentTimeMillis();
    thread.start();
    System.out.println(System.currentTimeMillis() - start);

    start = System.currentTimeMillis();
    thread.run();
    System.out.println(System.currentTimeMillis() - start);
}

程序輸出:

0
Java技術棧
3000
Java技術棧

從程序輸出結果可以看出,啟動 start 方法前后只用了 0 毫秒,而啟動 run 方法則阻塞了 3000 毫秒等程序執行完再繼續執行,這就是同步與異步的一個最重要的區別。

看完這篇,你應該對 start 和 run 方法有了一個大概的掌握吧,再也不怕面試官問你這兩個的區別了吧!

動手轉發給更多的朋友吧!

更多 Java 多線程技術文章請在Java技術棧微信公眾號后臺回復關鍵字:多線程。

本文原創首發于微信公眾號:Java技術棧(id:javastack),關注公眾號在后臺回復 "多線程" 可獲取更多,轉載請原樣保留本信息。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72147.html

相關文章

  • 【面試】Java相關

    摘要:可能會持有相同的值對象但鍵對象必須是唯一的。當有新任務到達時,線程池沒有線程則創建線程處理,處理完成后該線程緩存秒,過期后回收,線程過期前有新任務到達時,則使用緩存的線程來處理。解決死鎖問題的三種方法預防死鎖檢測死鎖及避免死鎖。 最近辭職準備面試,順便整理一下面試題分享給大家,如有錯誤歡迎指出 01. 你對面向對象思想的理解? 面向對象編程簡稱OOP,是開發程序的一種方法、思想。面向...

    icattlecoder 評論0 收藏0
  • Java面試題

    摘要:近段時間在準備實習的面試,在網上看到一份面試題,就慢慢試著做,爭取每天積累一點點。現在每天給自己在面試題編寫的任務是題,有時候忙起來可能就沒有時間寫了,但是爭取日更,即使當天沒更也會在之后的更新補上。 ????近段時間在準備實習的面試,在網上看到一份面試題,就慢慢試著做,爭取每天積累一點點。????暫時手頭上的面試題只有一份,題量還是挺大的,有208題,所以可能講的不是很詳細,只是我自...

    OnlyMyRailgun 評論0 收藏0
  • Thread、HandlerHandlerThread關系何在?

    摘要:總結的使用方法還是比較簡單的,但是我們要明白一點的是如果一個線程要處理消息,那么它必須擁有自己的,并不是在哪里創建,就可以在哪里處理消息的。如果不用的話,需要手動去調用和這些方法。 前言 前幾天看到一道面試題:Thread、Handler和HandlerThread有什么區別?,這個題目有點意思,對于很多人來說,可能對Thread和Handler很熟悉,主要涉及到Android的消息機...

    hankkin 評論0 收藏0
  • Java線程池架構(一)原理源碼解析

    摘要:在前面介紹的文章中,提到了關于線程池的創建介紹,在文章之系列外部中第一部分有詳細的說明,請參閱文章中其實說明了外部的使用方式,但是沒有說內部是如何實現的,為了加深對實現的理解,在使用中可以放心,我們這里將做源碼解析以及反饋到原理上,工具可 在前面介紹JUC的文章中,提到了關于線程池Execotors的創建介紹,在文章:《java之JUC系列-外部Tools》中第一部分有詳細的說明,請參...

    wthee 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<