java并發(fā)編程(一) 進(jìn)程和線程

一、進(jìn)程與線程

1.1 進(jìn)程

進(jìn)程: 是程序的一次動態(tài)執(zhí)行麸拄,它對應(yīng)著從代碼加載派昧,執(zhí)行至執(zhí)行完畢的一個完整的過程,是一個動態(tài)的實(shí)體感帅,它有自己的生命周期斗锭。它因創(chuàng)建而產(chǎn)生,因調(diào)度而運(yùn)行失球,因等待資源或事件而被處于等待狀態(tài)岖是,因完成任務(wù)而被撤消帮毁。反映了一個程序在一定的數(shù)據(jù) 集上運(yùn)行的全部動態(tài)過程。通過進(jìn)程控制塊(PCB)唯一的標(biāo)識某個進(jìn)程豺撑。同時進(jìn)程占據(jù)著相應(yīng)的資源(例如包括cpu的使用 烈疚,輪轉(zhuǎn)時間以及一些其它設(shè)備的權(quán)限)。

是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨(dú)立單位聪轿。

1.2 線程

一個進(jìn)程可以分為一到多個線程
一個線程就是一個指令流爷肝,將指令流中的一條條指令以一定的順序交給CPU執(zhí)行。
JAVA中陆错,線程作為最小的調(diào)度單位灯抛,進(jìn)程作為資源分配的最小單位。在windows中進(jìn)程是不活動的音瓷,只是作為線程的容器对嚼。

1.3 進(jìn)程和線程對比

圖片.png

二、并行和并發(fā)绳慎、同步和異步纵竖、阻塞和非阻塞

2.1 并行和并發(fā)

并發(fā):一個處理器可以同時處理多個任務(wù)。這是邏輯上的同時發(fā)生杏愤。
即:同一時間可以應(yīng)對多個任務(wù)的能力靡砌。

并行:多個處理器同時處理多個不同的任務(wù)。這是物理上的同時發(fā)生珊楼。
即:同一時間可以同時做多個任務(wù)的能力通殃。

有一個清晰地比喻:
并發(fā):一個人同時吃三個蘋果。并行:三個人同時吃三個蘋果亥曹。

  • 并發(fā)(concurrency)


    圖片.png
  • 并行(parallel)


    圖片.png

2.2 邓了、同步和異步

同步:需要等待結(jié)果返回,才能繼續(xù)運(yùn)行媳瞪。

異步:無需等待結(jié)果返回骗炉,就能繼續(xù)運(yùn)行。

同步就是燒開水蛇受,需要自己去輪詢(每隔一段時間去看看水開了沒)句葵,異步就是水開了,然后水壺會通知你水已經(jīng)開了兢仰,你可以回來處理這些開水了乍丈。
同步和異步是相對于操作結(jié)果來說,會不會等待結(jié)果返回把将。

2.3轻专、阻塞和非阻塞

阻塞就是線程在執(zhí)行過程中不可以做其它的事情,非阻塞就是線程在執(zhí)行中可以做其它的事情察蹲。

  • 阻塞舉例
    順序開會请垛,一場會開完才能開另一場會催训。

  • 非阻塞舉例
    一邊打印文件一邊聽歌。

三宗收、通過繼承Thread或?qū)崿F(xiàn)Runnable 接口創(chuàng)建線程

3.1 直接重寫Thread的run 方法

  • demo01 創(chuàng)建Thread
@Slf4j
public class CreateThread {

    public static void main(String[] args) {

        method01();
        method02();
        log.info("thread is running");
    }

    public static void method01(){
        Thread thread = new Thread(){

            @Override
            public void run(){
                log.info(" running");
            }
        };
        thread.setName("th01");
        thread.start();
    }

    public static void method02(){
        Thread thread = new Thread(() -> log.info(" running"));
        thread.setName("th02");
        thread.start();
    }
}

3.2 自定義類實(shí)現(xiàn)實(shí)現(xiàn)Runnable 接口

@Slf4j
public class JeffRunnable implements Runnable {

    private int ticket = 5;

    @Override
    public void run() {
        while (true) {
            log.info("Thread ticket = {}", ticket--);
            if (ticket < 0) {
                break;
            }
        }
        log.info("my thread is running");
    }

    public static void main(String[] args) {
        JeffRunnable myThread = new JeffRunnable();
        Thread thread01 = new Thread(myThread);
        Thread thread02 = new Thread(myThread);
        thread01.setName("my thread 01");
        thread02.setName("my thread 02");
        thread01.start();
        thread02.start();
    }
}
00:10:07.666 [my thread 01] INFO com.learn.thread.learn01.MyThread - Thread ticket = 5
00:10:07.666 [my thread 02] INFO com.learn.thread.learn01.MyThread - Thread ticket = 4
00:10:07.679 [my thread 02] INFO com.learn.thread.learn01.MyThread - Thread ticket = 2
00:10:07.679 [my thread 01] INFO com.learn.thread.learn01.MyThread - Thread ticket = 3
00:10:07.679 [my thread 02] INFO com.learn.thread.learn01.MyThread - Thread ticket = 1
00:10:07.679 [my thread 01] INFO com.learn.thread.learn01.MyThread - Thread ticket = 0
00:10:07.679 [my thread 01] INFO com.learn.thread.learn01.MyThread - my thread is running
00:10:07.679 [my thread 02] INFO com.learn.thread.learn01.MyThread - my thread is running

3.3 Thread 和 Runnable接口的關(guān)系

Thread有單繼承的問題漫拭;
Thread 本身也是實(shí)現(xiàn)了Runnable接口

public
class Thread implements Runnable {
    /* Make sure registerNatives is the first thing <clinit> does. */
    private static native void registerNatives();
    static {
        registerNatives();
    }

    private volatile String name;
    private int            priority;
    private Thread         threadQ;
    private long           eetop;

四、通過Callable混稽、Future和FutureTask 創(chuàng)建線程

4.1 Callable

  • Callable 是一個接口采驻,含有一個帶返回值的call 方法
@FunctionalInterface
public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

4.2 Future

Future就是對于具體的Runnable或者Callable任務(wù)的執(zhí)行結(jié)果進(jìn)行取消、查詢是否完成匈勋、獲取結(jié)果礼旅。必要時可以通過get方法獲取執(zhí)行結(jié)果,該方法會阻塞直到任務(wù)返回結(jié)果洽洁。

  • Future 也是一個接口各淀,定義了6個方法
public interface Future<V> {
     //方法用來取消任務(wù)
    boolean cancel(boolean mayInterruptIfRunning);
    //方法表示任務(wù)是否被取消成功
    boolean isCancelled();
    // 方法表示任務(wù)是否已經(jīng)完成
    boolean isDone();
    // 方法用來獲取執(zhí)行結(jié)果,這個方法會產(chǎn)生阻塞诡挂,會一直等到任務(wù)執(zhí)行完畢才返回;
    V get() throws InterruptedException, ExecutionException;
    //用來獲取執(zhí)行結(jié)果临谱,如果在指定時間內(nèi)璃俗,還沒獲取到結(jié)果,就直接返回null悉默。
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

也就是說Future提供了三種功能:
1)判斷任務(wù)是否完成城豁;
2)能夠中斷任務(wù);
3)能夠獲取任務(wù)執(zhí)行結(jié)果抄课。

因?yàn)镕uture只是一個接口唱星,所以是無法直接用來創(chuàng)建對象使用的,因此就有了下面的FutureTask跟磨。

4.3 FutureTask

FutureTask 通過 RunnableFuture 間接實(shí)現(xiàn)了Runnable 和 Future

public class FutureTask<V> implements RunnableFuture<V> {
public interface RunnableFuture<V> extends Runnable, Future<V> {
    /**
     * Sets this Future to the result of its computation
     * unless it has been cancelled.
     */
    void run();
}

  • FutureTask 兩個構(gòu)造函數(shù)间聊,既可以處理callable,又可以處理runnable
 public FutureTask(Callable<V> callable) {
        if (callable == null)
            throw new NullPointerException();
        this.callable = callable;
        this.state = NEW;       // ensure visibility of callable
    }


 public FutureTask(Runnable runnable, V result) {
        this.callable = Executors.callable(runnable, result);
        this.state = NEW;       // ensure visibility of callable
    }

4.4 代碼示例

@Slf4j
public class JeffCallable implements Callable<Integer> {

    private int ticket = 5;

    @Override
    public Integer call() {
        ticket--;
        log.info("Thread ticket = {}", ticket);
        return ticket;
    }

    public static void main(String[] args) {
        //創(chuàng)建callable對象
        JeffCallable call=new JeffCallable();
        FutureTask<Integer> futureTask=new FutureTask<Integer>(call);
        Thread thread=new Thread(futureTask,"th01");
        thread.start();
        //得到返回值
        try {
           log.info("返回值是:{}",  futureTask.get());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抵拘,一起剝皮案震驚了整個濱河市哎榴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌僵蛛,老刑警劉巖尚蝌,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異充尉,居然都是意外死亡飘言,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門驼侠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姿鸿,“玉大人谆吴,你說我怎么就攤上這事“忝睿” “怎么了纪铺?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碟渺。 經(jīng)常有香客問我鲜锚,道長,這世上最難降的妖魔是什么苫拍? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任芜繁,我火速辦了婚禮,結(jié)果婚禮上绒极,老公的妹妹穿的比我還像新娘骏令。我一直安慰自己,他們只是感情好垄提,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布榔袋。 她就那樣靜靜地躺著,像睡著了一般铡俐。 火紅的嫁衣襯著肌膚如雪凰兑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天审丘,我揣著相機(jī)與錄音吏够,去河邊找鬼。 笑死滩报,一個胖子當(dāng)著我的面吹牛锅知,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脓钾,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼售睹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了可训?” 一聲冷哼從身側(cè)響起侣姆,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沉噩,沒想到半個月后捺宗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡川蒙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年蚜厉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畜眨。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡昼牛,死狀恐怖术瓮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贰健,我是刑警寧澤胞四,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站伶椿,受9級特大地震影響辜伟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脊另,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一导狡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧偎痛,春花似錦旱捧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谓谦,卻和暖如春标锄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茁计。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谓松,地道東北人星压。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像鬼譬,于是被迫代替她去往敵國和親娜膘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353