1. 程式人生 > >java多執行緒與高併發庫應用(二)執行緒建立和定時任務Timer

java多執行緒與高併發庫應用(二)執行緒建立和定時任務Timer

1、建立執行緒的兩種方式
通過start,
執行run方法。

第一種實現runnable,
定義類實現Runnable介面
重寫Runnable介面中的run方法
通過Thread建立執行緒物件
將Runnable介面的子類物件作為實際引數傳遞給Thread類的建構函式
呼叫Thread類的start方法開啟執行緒並呼叫Runnable介面的子類的run方法
為什麼要覆蓋run方法:Thread類用於描述執行緒。該類就定義了一個功能,用於儲存執行緒要執行的程式碼。該儲存功能就是run方法。也就是說Thread類中的run方法,用於儲存執行緒執行的程式碼。

第二種繼承Thread,
定義類繼承Thread
複寫Thread類中的run方法
目的將自定義的程式碼儲存在run方法中,讓執行緒執行。
呼叫執行緒的start方法
該方法兩個作用:啟動執行緒,呼叫run方法。

Thread thread = new Thread(){
            @Override
            public void run() {
                while(true){
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out
.println("1:" + Thread.currentThread().getName()); this.setName("wolf"); System.out.println("2:" + this.getName()); } } }; thread.start();
new Thread(
                new Runnable(){
                    public void
run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("runnable :" + Thread.currentThread().getName()); } } } ){ public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("thread :" + Thread.currentThread().getName()); } } }.start();

我們可以通過setName()為我們的執行緒命名

定時任務Timer

最簡單的時間段執行定時:
new Timer().schedule(new TimerTask() {

            @Override
            public void run() {
                System.out.println("bombing!");

            }
        }, 10000,3000);//1秒後每隔3秒執行一次
那麼想要改變時間定時任務執行需要怎麼做呢?:
class MyTimerTask extends TimerTask{

            @Override
            public void run() {
                count = (count+1)%2;
                System.out.println("bombing!"+count);
                new Timer().schedule(new TimerTask() {

                    @Override
                    public void run() {
                        System.out.println("bombing!"+"wolf");
                    }
                },2000+2000*count);
            }
        }

        new Timer().schedule(new MyTimerTask(), 2000);
上述結果為:
bombing! 1
bombing! wolf
但是我想要一直執行:
class MyTimerTask extends TimerTask{

            @Override
            public void run() {
                count = (count+1)%2;
                System.out.println("bombing!"+count);
                new Timer().schedule(/*new TimerTask() {

                    @Override
                    public void run() {
                        System.out.println("bombing!"+"wolf");
                    }
                }*/new MyTimerTask(),2000+2000*count);
            }
        }

        new Timer().schedule(new MyTimerTask(), 2000);

這裡寫圖片描述

執行緒暫停一會然後繼續執行,我們再加上一個睡眠方法。
while(true){
            System.out.println(new Date().getSeconds());
            try {
                Thread.sleep(1000);
                System.out.println("我去睡覺了一會回來!");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

這裡寫圖片描述

*********************************************
new Timer().schedule(new TimeTask(){
@orriverde
public  void run(){
sys.out("bombing");
new Timer().schedule(new TimeTask(){
@orriverde
public  void run(){
sys.out("bombing");
}
},30000)
}
},30000);//3秒後爆炸再過3秒執行一次爆炸
********************************************
class MyTimeTask extends TimeTask {
@orriverde
public  void run(){
sys.out("bombing");
new MyTimeTask(),30000)
}
},

new Timer().schedule(new MyTimeTask(),30000);
每隔3秒執行一次