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

以前有簡單介紹過java多線程的使用,已經Thread類和Runnable類,爲了更好地理解多線程,本文就Thread進行詳細的分析。java

start()

start方法是開啓線程的方法,使用後java會建立一個新的線程執行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");

執行結果:
it is over
Thread-1 start
Thread-0 start
Thread-2 start
Thread-0 end
Thread-1 end
Thread-2 end多線程

因爲多線程是有隨機性的,因此每次的結果可能都不同,這一點也是咱們須要注意的,線程的執行順序和調用順序並不一致。ide

run()

run方法就是調用Thread設置的Runnable的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.run();
        }
        System.out.println("it is over");

執行結果:
main start
main end
main start
main end
main start
main end
it is over
run方法的直接結果和start有很大的差異,徹底是按順序執行,並無開啓新線程。日誌

stop()

stop方法是強制中止線程的執行,是非安全的,不要使用此方法。在調用stop時, 會對鎖定的資源進行釋放,但這種釋放是非一致的,容易引發程序問題。若是想要控制線程的中止,可使用自定義變量來判斷或者isInterrupted()方法:code

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

interrupt()

interrupt的做用是通知線程,你已經被中斷的,但具體的中斷執行須要在線程自定義處理,甚至你能夠不理會繼續執行。具體的中孤單是會線程執行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();

執行結果:get

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()

判斷線程是否中斷,在執行上面的interrupt方法後,會return true。it

setPriority(int newPriority)和getPriority()

設置線程的優先級和獲取線程的優先級,cpu分配的資源給側重給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();

執行結果:

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

在優先級同樣的狀況下,t1和t2是幾乎同時完成的,在優先級不同的狀況,有明顯的差異。

getName()

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

join()和join(long millis)

jion方法的做用是等待線程執行完成,join(long millis)能夠設置最長等待時間。好比主線程須要等待子線程完成,獲取子線程的結果後才能繼續往下執行,這時候就可使用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執行完,再執行");

執行結果:

Thread-0 start
Thread-0 t1 end 1001
等待t1執行完,再執行
相關文章
相關標籤/搜索