天天看點

黑馬程式員-線程(兩種建立方式)、定時器

---------------------- <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>、期待與您交流! ----------------------