成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java多線程(2)Thread的實(shí)例方法

ispring / 1964人閱讀

摘要:之前有簡單介紹過多線程的使用,已經(jīng)類和類,為了更好地理解多線程,本文就進(jìn)行詳細(xì)的分析。方法是強(qiáng)制停止線程的執(zhí)行,是非安全的,不要使用此方法。比較簡單,獲取線程的名稱。和方法的作用是等待線程執(zhí)行完成,可以設(shè)置最長等待時間。

之前有簡單介紹過java多線程的使用,已經(jīng)Thread類和Runnable類,為了更好地理解多線程,本文就Thread進(jìn)行詳細(xì)的分析。

start()

start方法是開啟線程的方法,使用后java會創(chuàng)建一個新的線程執(zhí)行run里的方法。這是一個小demo:

        for(int i=0;i<3;i++){
            Thread t= new Thread(new Runnable() {
                @Override
                public void run() {
            System.out.println(Thread.currentThread().getName()+" start");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            System.out.println(Thread.currentThread().getName()+" end");
                }
            });
            t.start();
        }
        System.out.println("it is over");

執(zhí)行結(jié)果:
it is over
Thread-1 start
Thread-0 start
Thread-2 start
Thread-0 end
Thread-1 end
Thread-2 end

由于多線程是有隨機(jī)性的,所以每次的結(jié)果可能都不一樣,這一點(diǎn)也是我們需要注意的,線程的執(zhí)行順序和調(diào)用順序并不一致。

run()

run方法就是調(diào)用Thread設(shè)置的Runnable的run方法,將上面的demo進(jìn)行修改:

        for(int i=0;i<3;i++){
            Thread t= new Thread(new Runnable() {
                
                @Override
                public void run() {
            System.out.println(Thread.currentThread().getName()+" start");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            System.out.println(Thread.currentThread().getName()+" end");
                }
            });
            t.run();
        }
        System.out.println("it is over");

執(zhí)行結(jié)果:
main start
main end
main start
main end
main start
main end
it is over
run方法的直接結(jié)果和start有很大的差別,完全是按順序執(zhí)行,并沒有開啟新線程。

stop()

stop方法是強(qiáng)制停止線程的執(zhí)行,是非安全的,不要使用此方法。在調(diào)用stop時, 會對鎖定的資源進(jìn)行釋放,但這種釋放是非一致的,容易引起程序問題。如果想要控制線程的停止,可以使用自定義變量來判斷或者isInterrupted()方法:

class Thread1 extends Thread {
    @Override
    public void run() {
        //判斷線程體是否運(yùn)行
        while (!isInterrupted()) {
            // Do Something
        }
    }    
}
interrupt()

interrupt的作用是通知線程,你已經(jīng)被中斷的,但具體的中斷執(zhí)行需要在線程自定義處理,甚至你可以不理會繼續(xù)執(zhí)行。具體的中孤單是會線程執(zhí)行join、wait、sleep方法時,拋出InterruptedException。

Thread t1 = new Thread(new Runnable() {
                @Override
                public  void  run() {
                        System.out.println(Thread.currentThread().getName()+" start");
                        try {
                            for(int i=0;i<100000;i++){
                                System.out.println(i+"");
                                Thread.sleep(1);
                            }
                        } catch (InterruptedException e) {
                            System.out.println("the thread is interrupted");//可以在這里做資源釋放,日志記錄等
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()+" end");
                    }
            });
            t1.start();
            Thread.sleep(100);
            t1.interrupt();

執(zhí)行結(jié)果:

65
66
67
68
the thread is interrupted
java.lang.InterruptedException: sleep interrupted
Thread-0 end
    at java.lang.Thread.sleep(Native Method)
    at com.wk.aqi.act.Test$1.run(Test.java:23)
    at java.lang.Thread.run(Thread.java:745)
isInterrupted()

判斷線程是否中斷,在執(zhí)行上面的interrupt方法后,會return true。

setPriority(int newPriority)和getPriority()

設(shè)置線程的優(yōu)先級和獲取線程的優(yōu)先級,cpu分配的資源給側(cè)重給priority高的線程。

Thread t1 = new Thread(new Runnable() {
                @Override
                public  void  run() {
                        long t = System.currentTimeMillis();
                        System.out.println(Thread.currentThread().getName()+" start");
                        for(int i=0;i<1000;i++){
                            try {
                                Thread.sleep(1);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        System.out.println(Thread.currentThread().getName()+" t1 end "+(System.currentTimeMillis()-t));
                    }
            });
            Thread t2 = new Thread(new Runnable() {
                @Override
                public  void  run() {
                    long t = System.currentTimeMillis();
                    System.out.println(Thread.currentThread().getName()+" start");
                    for(int i=0;i<1000;i++){
                        try {
                            Thread.sleep(1);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    System.out.println(Thread.currentThread().getName()+" t2 end "+(System.currentTimeMillis()-t));
                }
            });
            t1.setPriority(10);
            t2.setPriority(1);
            t2.start();
            t1.start();

執(zhí)行結(jié)果:

Thread-0 start
Thread-1 start
Thread-0 t1 end 1357
Thread-1 t2 end 1371

在優(yōu)先級一樣的情況下,t1和t2是幾乎同時完成的,在優(yōu)先級不一樣的情況,有明顯的差別。

getName()

比較簡單,獲取線程的名稱。

join()和join(long millis)

jion方法的作用是等待線程執(zhí)行完成,join(long millis)可以設(shè)置最長等待時間。比如主線程需要等待子線程完成,獲取子線程的結(jié)果后才能繼續(xù)往下執(zhí)行,這時候就可以使用join方法

Thread t1 = new Thread(new Runnable() {
            @Override
            public  void  run() {
                    long t = System.currentTimeMillis();
                    System.out.println(Thread.currentThread().getName()+" start");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+" t1 end "+(System.currentTimeMillis()-t));
                }
        });
        t1.start();
        t1.join();
        System.out.println("等待t1執(zhí)行完,再執(zhí)行");

執(zhí)行結(jié)果:

Thread-0 start
Thread-0 t1 end 1001
等待t1執(zhí)行完,再執(zhí)行

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70679.html

相關(guān)文章

  • Java 線程編程基礎(chǔ)——Thread

    摘要:程序執(zhí)行時,至少會有一個線程在運(yùn)行,這個運(yùn)行的線程被稱為主線程。程序的終止是指除守護(hù)線程以外的線程全部終止。多線程程序由多個線程組成的程序稱為多線程程序。線程休眠期間可以被中斷,中斷將會拋出異常。 線程 我們在閱讀程序時,表面看來是在跟蹤程序的處理流程,實(shí)際上跟蹤的是線程的執(zhí)行。 單線程程序 在單線程程序中,在某個時間點(diǎn)執(zhí)行的處理只有一個。 Java 程序執(zhí)行時,至少會有一個線程在運(yùn)行...

    zhoutk 評論0 收藏0
  • Java線程基礎(chǔ)(一)——線程與鎖

    摘要:一線程的基本概念單線程簡單的說,單線程就是進(jìn)程中只有一個線程。多線程由一個以上線程組成的程序稱為多線程程序。當(dāng)線程調(diào)用完方法進(jìn)入后會自動釋放鎖,線程獲得鎖。 一、線程的基本概念 1.1 單線程 簡單的說,單線程就是進(jìn)程中只有一個線程。單線程在程序執(zhí)行時,所走的程序路徑按照連續(xù)順序排下來,前面的必須處理好,后面的才會執(zhí)行。 Java示例: public class SingleThrea...

    WelliJhon 評論0 收藏0
  • Java線程學(xué)習(xí)(六)Lock鎖使用

    摘要:返回與此鎖相關(guān)聯(lián)的給定條件等待的線程數(shù)的估計。查詢是否有線程正在等待獲取此鎖。為公平鎖,為非公平鎖線程運(yùn)行了獲得鎖定運(yùn)行結(jié)果公平鎖的運(yùn)行結(jié)果是有序的。 系列文章傳送門: Java多線程學(xué)習(xí)(一)Java多線程入門 Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(2) Java多線程學(xué)習(xí)(三)volatile關(guān)鍵字 ...

    Caicloud 評論0 收藏0
  • Java中如何實(shí)現(xiàn)線程

    摘要:這種方式實(shí)現(xiàn)多線程很簡單,通過自己的類直接,并復(fù)寫方法,就可以啟動新線程并執(zhí)行自己定義的方法。 JAVA多線程實(shí)現(xiàn)方式主要有兩種:繼承Thread類、實(shí)現(xiàn)Runnable接口。 1、繼承Thread類實(shí)現(xiàn)多線程 繼承Thread類的方法盡管被我列為一種多線程實(shí)現(xiàn)方式,但Thread本質(zhì)上也是實(shí)現(xiàn)了Runnable接口的一個實(shí)例,它代表一個線程的實(shí)例,并且,啟動線程的唯一方法就是通過...

    Flands 評論0 收藏0
  • (二)線程應(yīng)用及挑戰(zhàn)

    摘要:上下文切換會影響到線程的執(zhí)行速度,對于系統(tǒng)來說意味著會消耗大量的時間減少上下文切換的方式無鎖并發(fā)編程,在多線程競爭鎖時,會導(dǎo)致大量的上下文切換。線程在中的使用在中實(shí)現(xiàn)多線程的方式比較簡單,因?yàn)橹刑峁┝朔浅7奖愕膩韺?shí)現(xiàn)多線程。 文章簡介 上一篇文章我們了解了進(jìn)程和線程的發(fā)展歷史、線程的生命周期、線程的優(yōu)勢和使用場景,這一篇,我們從Java層面更進(jìn)一步了解線程的使用 內(nèi)容導(dǎo)航 并發(fā)編程的...

    hqman 評論0 收藏0
  • Java synchronized 線程同步問題詳解

    摘要:同步代碼塊二類,鎖是小括號中的類對象對象。因?yàn)閷τ谕粋€實(shí)例對象,各線程之間訪問其中的同步方法是互斥的。優(yōu)化同步代碼塊的方式有,減少同步區(qū)域或減小鎖的范圍。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請注明出處:https://segmentfault.com/a/1190000009225706 1. 引言 在 Java 多線程編程中,我們常需要考慮線程安全問題,其中關(guān)鍵字 synchro...

    Eidesen 評論0 收藏0

發(fā)表評論

0條評論

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