版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37636695/article/details/79116709
Java中实现多线程有两种方法:继承Thread类;实现Runnable接口。
Thread类的run()方法的制定了接口Runnable中的run();
在Thread类中没有完全实现Runnable接口中的run()方法。
Thread类是Runnable接口的子类,Thread类中的run()方法调用的是Runnable接口中的run()方法。
public class Thread implements Runnable { //Thread类的部分定义
private Runnable target; //封装
public Thread(Runnable target){ //构造函数
init(target);
}
private void init(Runnable target2) { //检验关口,给属性赋值
this.target = target;
}
public void run() {
if(target != null){
target.run(); //此run方法指的是自定义的run方法,即Runable中的run方法
//整个过程中,只有一个对象,只有这个对象有能力调用自定
//义的run方法。
}
}
}
由于使用Runable的整个过程中,只产生一个对象,所以可以方便地实现资源的共享。
这也是Runable优于Thread之处。
启动线程是调用start方法启动:
public synchronized void start() {
// 如果线程不是"就绪状态",则抛出异常!
if (threadStatus != 0)
throw new IllegalThreadStateException();
// 将线程添加到ThreadGroup中
group.add(this);
boolean started = false;
try {
// 通过start0()启动线程
start0();
// 设置started标记
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
从上面的源码可以看出,如果一个类继承了Thread类,那么只能调用一次start()方法,如果多次调用,
将会出现“IllegalThreadStateException”异常。
Thread与Runable的重要区别之一是:
Thread不适合于多线程共享资源。
Runable可以方便地实现资源的共享。
如果一个类只能继承Thread类才能实现多线程,则必定受到单线程的局限性。
所以一般来说我们会用Runable接口来完成多线程操作。
扫描二维码关注公众号,回复:
2895471 查看本文章