java多執行緒與高併發庫應用(二)執行緒建立和定時任務Timer
阿新 • • 發佈:2019-01-04
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秒執行一次