---------------------- <a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="blank">.Net教育訓練</a>、期待與您交流! ----------------------
傳統的建立線程的兩種方式:
第一種方式:
Thread thread1 = new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
System.out.println(Thread.currentThread().getName());
}
}
};
thread1.start();
這種方式相當于new了一個Thread的子類,子類覆寫了父類的run方法,是以運作時就不會運作父類的run方法了。
第二種方式:
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
System.out.println(Thread.currentThread().getName());
}
}
});
thread2.start();
這種方式并不是new了子類,而是傳入了一個Runnable對象
源碼中:
public void run() {
if (target != null) {
target.run();
}
}
而target是這麼定義的:
Runnable target;
指派:
this.target = runnable;
是以運作的是Runnable的run方法,但是如果子類覆寫父類的run方法,那麼就會運作父類的run方法。
做個測試:
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Runnable"
+ Thread.currentThread().getName());
}
}) {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Thread" + Thread.currentThread().getName());
}
};
thread1.start();
運作結果:
可以看出并沒有運作Runnable中的方法。
傳統定時器的用法:
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("bombing");
}
}, 3000);
這表示在 3秒後列印bombing,還有另一種方式,
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("bombing");
}
}, 3000, 1000);
這表示在3秒後列印bombing,然後每隔2秒再次列印。
現在有一個需求,要求每隔4秒列印一次,然後是2秒,然後又是4秒........
老師的代碼是這樣寫的
static int i = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
class MyTimerTask extends TimerTask {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("111111111111111");
new Timer().schedule(new MyTimerTask(),
2000 * (i = (i % 2) + 1));
}
}
new Timer().schedule(new MyTimerTask(), 2000);
}
但是自己感覺并不好,因為會建立出多個定時器。 Run 方法執行一次就會建立一個定時器。而且定時器執行的任務是一樣的。但自己也沒寫出更好的了。
---------------------- <a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="blank">.Net教育訓練</a>、期待與您交流! ----------------------