1.Thread和Runnable区别
我们要清楚Thread是一个类,他实现了Runnable接口,Runnable是一个接口,这是他们本质上的区别,我们都知道java是单继承语言,一个子类他的父类只能有一个,但是可以实现多个接口,我们平时需要新建一个线程通常的方法有两种,废话不多说,代码说话。
public class ThreadTest {
public static void main(String[] args) {
//方法1
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "~~~线程执行啦!");
}
});
t1.start();
//方法2
Thread t2 = new MyThread();
t2.start();
}
}
class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "~~~线程执行啦!");
}
}
2.run()和star()的区别
虽然我们线程方法都需要自己实现run方法,但是run和start有什么区别呢?先看个例子
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "~~~线程执行啦!");
}
});
t1.run();
t1.run();
t1.start();
Thread.sleep(10);
t1.start();
}
想知道结果吗?知道为什么吗?
代码中我执行run和start都把进程听了10ms,其实为了让方法按照我写的顺序执行,因为start他的底层会调用系统api新开一个线程,而我们调用run方法其实没有取到新开线程的作用,他就是一个类的一个普普通通的方法;
start方法实现源码:
public synchronized void start() {
//0状态是默认状态
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();//这个是他的具体实现,他是一个native方法,有系统来处理,他最终会调用run方法;
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
private native void start0();