---------------------- <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;
所以运行的是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">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------