1、在Thread子类覆盖的run方法里编写运行代码
2、在传递给Thread对象的Runnable对象的run方法里编写运行代码。
通过查看Thread类的run方法源码可知,这两种方式都是在调用Thread的run方法,如果Thread类的run方法没有被覆盖,并且为该Thread对象传递了一个Runnable对象,该run方法会调用Runnable对象的run方法。
如果在Thread子类中覆盖了run方法,也为Thread传递了一个runnable对象,那么线程执行时是运行哪个run方法,运行的是子类中覆盖了Thread的run方法。
Timer定时器
public class TraditionalTimerTest {
private static int count = 0;
public static void main(String[] args) {
class MyTimerTask extends TimerTask {
@Override
public void run() {
count = (count+1)%2;
System.out.println("bombing!");
new Timer().schedule(new MyTimerTask(), 2000+2000*count);
}
}
new Timer().schedule(new MyTimerTask(), 2000);
while (true) {
System.out.println(new Date().getSeconds());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
quartz