先看一道题:以下多线程执行的结果是什么?
new Thread(
new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1");
}
}
}
) {
@Override
public void run() {
while (true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2");
}
}
}.start();
看这个之前,我们先看一下java中,Thread
是怎么实现run
方法的。
我们先看第二张图,当target(Runnable)
不为空的时候,run
方法才会被执行。
我们把上面代码精简一下,可以得到如下代码:
new Thread(runnable.run()){
run()
}.start();
首先
Thread
执行start()
的时候,会先去执行自己的run()
方法,只有当自己的run()
为空的时候,才会去执行父类的runnable
,因此上文被执行的是System.out.println("2");
父类此时被子类覆盖了。
new Thread(runnable.run()){ //只有当自己的run()为空的时候才会被执行
run() //第一个被执行
}.start();
多线程的两种方式
- 继承Thread
- 实现 Runnable接口
①
//Thread的子类
Thread thread = new Thread() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
thread.start();
②
//第二个线程 实现Runnable
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
});
thread2.start();
注意:
以上为Demo,只演示代码,但是会造成死循环。