国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java多線(xiàn)程之線(xiàn)程的創(chuàng )建

發(fā)布時(shí)間:2021-07-17 21:51 來(lái)源:腳本之家 閱讀:0 作者:奧卡姆的剃刀生銹了 欄目: 編程語(yǔ)言

目錄

        一、三種創(chuàng )建方式

        二、通過(guò)Thread類(lèi)創(chuàng )建

        2.1 步驟

        • 自定義線(xiàn)程類(lèi)繼承Thread類(lèi)
        • 重寫(xiě)run()方法,編寫(xiě)線(xiàn)程執行體(當成main()方法用)
        • 創(chuàng )建線(xiàn)程對象,調用start()方法啟動(dòng)線(xiàn)程

        2.2 案例

        • 創(chuàng )建兩個(gè)線(xiàn)程,其中一個(gè)線(xiàn)程打印100以?xún)鹊呐紨?,另一個(gè)線(xiàn)程打印100以?xún)鹊钠鏀?/li>
        //主方法
        public class Demo01 {
            public static void main(String[] args) {
                Thread1 thread1 = new Thread1();
                Thread2 thread2 = new Thread2();
        
                thread1.start();
                thread2.start();
            }
        }
        
        //100以?xún)鹊呐紨?
        class Thread1 extends Thread {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    if (i%2==0){
                        System.out.println(Thread.currentThread().getName() + ":" + i);
                    }
                }
            }
        }
        
        //100以?xún)鹊钠鏀?
        class Thread2 extends Thread {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    if (i%2!=0){
                        System.out.println(Thread.currentThread().getName() + ":" + i);
                    }
                }
            }
        }
        
        • 也可以使用匿名內部類(lèi)的方法來(lái)實(shí)現(線(xiàn)程用過(guò)以后就不再用了)
        public class Demo02 {
            public static void main(String[] args) {
                //打印0~100內的偶數
                new Thread(){
                    @Override
                    public void run() {
                        for (int i = 0; i < 100; i++) {
                            if (i%2==0){
                                System.out.println(Thread.currentThread().getName() + ":" + i);
                            }
                        }
                    }
                }.start();
                //打印0~100內的奇數
                new Thread(){
                    @Override
                    public void run() {
                        for (int i = 0; i < 100; i++) {
                            if (i%2!=0){
                                System.out.println(Thread.currentThread().getName() + ":" + i);
                            }
                        }
                    }
                }.start();
            }
        }
        
        • 三個(gè)窗口同時(shí)賣(mài)票,票數總共為100張(注意票數應該是靜態(tài)變量,否則就是沒(méi)創(chuàng )建一個(gè)對象,該對象就有100張票)
        public class Test {
            public static void main(String[] args) {
                Window w1 = new Window("窗口 1 ");
                Window w2 = new Window("窗口 2 ");
                Window w3 = new Window("窗口 3 ");
        
                w1.start();
                w2.start();
                w3.start();
            }
        }
        
        class Window extends Thread{
            //這里票的數量應該是靜態(tài)變量,否則每個(gè)對象創(chuàng  )建后都有100張票,而不是總共100張票
            private static int tickets = 100;
        
            public Window(String name) {
                super(name);
            }
        
            @Override
            public void run() {
                while (tickets > 0){
                    tickets--;
                    System.out.println(getName() + "賣(mài)出了一張票,剩余票數:" + tickets);
                }
            }
        }
        
        • 注意:這里存在一個(gè)線(xiàn)程安全問(wèn)題未解決,后面將會(huì )講到。如下圖所示,剛開(kāi)始三個(gè)線(xiàn)程啟動(dòng)的時(shí)候,讀取的票數都是100張。

         

        2.3 注意的問(wèn)題

        • start()方法的作用:通過(guò)調用自己寫(xiě)的線(xiàn)程類(lèi)對象的start()方法,來(lái)啟動(dòng)該線(xiàn)程,并調用該線(xiàn)程的run()方法
        • 不能通過(guò)直接調用run()方法的方式啟動(dòng)線(xiàn)程
        • 不可以讓已經(jīng)start()的線(xiàn)程再次star()來(lái)同時(shí)跑兩個(gè)線(xiàn)程??梢酝ㄟ^(guò)新建一個(gè)該線(xiàn)程類(lèi)的對象,然后在對新建的對象start()

        三、Thread類(lèi)中常用的方法

        • start()啟動(dòng)當前線(xiàn)程;調用當前線(xiàn)程的run()方法
        • run():通常需要重寫(xiě)Thread類(lèi)中的此方法,將創(chuàng )建線(xiàn)程需要執行的操作聲明在此方法中(當做main()使用)
        • currentThread():靜態(tài)方法,返回執行當前代碼的線(xiàn)程
        • getName():獲取當前線(xiàn)程的名字
        • setName(String name):設置當前線(xiàn)程的名字
        • yield():釋放當前CPU的執行權(但也有可能下一刻的執行權又回到了當前線(xiàn)程,主控權還是在CPU手上)
        • join():在線(xiàn)程a中調用線(xiàn)程bjoin(),此時(shí)線(xiàn)程a就進(jìn)入阻塞狀態(tài),直到線(xiàn)程b完全執行完之后,線(xiàn)程a在結束阻塞狀態(tài)
        • stop():當執行此方法時(shí),強制結束當前線(xiàn)程(已停用
        • sleep(int millitime):讓當前線(xiàn)程“睡眠”指定的millitime毫秒。在指定的millitime毫秒時(shí)間內,當前進(jìn)程是阻塞狀態(tài)
        • isAlive():判斷當前線(xiàn)程是否存活(線(xiàn)程執行完之前都是存活的)

        3.1 案例

        • 同樣是上面的三個(gè)窗口買(mǎi)票的問(wèn)題,同樣是100張票,但使用這種創(chuàng )建方法,tickets可以不使用靜態(tài)變量

         

        四、通過(guò)實(shí)現Runnable接口來(lái)創(chuàng )建線(xiàn)程

        4.1 創(chuàng )建步驟

        • 創(chuàng )建一個(gè)實(shí)現了Runnable接口的類(lèi)
        • 實(shí)現類(lèi)去實(shí)現Runnable接口中的抽象方法:run()
        • 創(chuàng )建實(shí)現類(lèi)的對象
        • 將此對象作為參數傳遞到Thread類(lèi)的構造器中,創(chuàng )建Thread類(lèi)的對象
        • 通過(guò)Thread類(lèi)的對象調用start()
        • 這里的start()首先啟動(dòng)了當前的線(xiàn)程,然后調用了Runnable類(lèi)型的target的run()

         

        五、繼承Thread類(lèi)和實(shí)現Runnable接口兩種方式比較

        開(kāi)發(fā)中,優(yōu)先選擇實(shí)現Runnable接口的方式創(chuàng )建線(xiàn)程

        原因:

        • 實(shí)現Runnable接口的方式?jīng)]有類(lèi)的單繼承性的局限性(一個(gè)類(lèi)只能繼承一個(gè)父類(lèi),繼承了Thread類(lèi)就不能在繼承其他類(lèi)了)
        • 實(shí)現Runnable接口的方式更適合來(lái)處理多個(gè)線(xiàn)程之間有共享數據的情況

        聯(lián)系:Thread類(lèi)本身也實(shí)現了Runnable接口

        相同點(diǎn):兩種方式都需要重寫(xiě)run()方法,將線(xiàn)程要執行的邏輯聲明在run()方法中

        六、線(xiàn)程的優(yōu)先級設置

        調度策略

        • 對于同優(yōu)先級的線(xiàn)程,組成先入先出隊列(先到先服務(wù)),使用時(shí)間片策略
        • 對于高優(yōu)先級,使用優(yōu)先調度的搶占式模式

        線(xiàn)程的優(yōu)先級分為1~10十個(gè)檔,其中:

        • NORM_PRIORITY:5 —— 普通優(yōu)先級,即默認的優(yōu)先級
        • MAX_PRIORITY:10 —— 最高優(yōu)先級
        • MIN_PRIORITY:1 —— 最低優(yōu)先級
        • getPriority():獲取線(xiàn)程的優(yōu)先級
        • setPriority(int p):設置線(xiàn)程的優(yōu)先級

        注意:高優(yōu)先級的線(xiàn)程要搶占低優(yōu)先級線(xiàn)程CPU的執行權。但是只是從概率上來(lái)講,高優(yōu)先級的線(xiàn)程高概率的情況下被執行。并不意味著(zhù)只有當高優(yōu)先級的線(xiàn)程被執行完以后,低優(yōu)先級的線(xiàn)程才會(huì )被執行。

        七、總結

        線(xiàn)程開(kāi)啟后不一定立即執行,有CPU進(jìn)行調度(如果只有一個(gè)CPU,主線(xiàn)程和創(chuàng )建的線(xiàn)程會(huì )交替執行)

        到此這篇關(guān)于Java多線(xiàn)程之線(xiàn)程的創(chuàng )建的文章就介紹到這了,更多相關(guān)Java線(xiàn)程的創(chuàng )建內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

        免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

        久久亚洲精品无码AⅤ大香| 天堂在线资源中文在线8| 亚洲国产成人VA在线观看| 欧美最厉害的喷水VIDEOS| 国产午夜福利不卡在线观看| 亚洲AV色区一区二区三区|