黑马程序员-线程(两种创建方式)、定时器

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"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;

所以运行的是Runnablerun方法,但是如果子类覆盖父类的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">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值