1700449511
1700449512
public void run(){
1700449513
1700449514
//MultiThread do something.
1700449515
1700449516
}
1700449517
1700449518
}
1700449519
1700449520
覆写run方法,这好办,写上自己的业务逻辑即可,但为什么要覆写start方法呢?最常见的理由是:要在客户端中调用start方法启动线程,不覆写start方法怎么启动run方法呢?于是乎就覆写了start方法,在方法内调用run方法。客户端代码是一个标准程序,代码如下:
1700449521
1700449522
public static void main(String[]args){
1700449523
1700449524
//多线程对象
1700449525
1700449526
MultiThread multiThread=new MultiThread();
1700449527
1700449528
//启动多线程
1700449529
1700449530
multiThread.start();
1700449531
1700449532
}
1700449533
1700449534
相信读者都能看出这是一个错误的多线程应用,main方法根本就没有启动一个子线程,整个应用程序中只有一个主线程在运行,并不会创建任何其他的线程。对此,有很简单的解决办法,只要删除MultiThread类中的start方法即可。
1700449535
1700449536
然后呢?就结束了吗?是的,很多时候确实到此结束了。找我解惑的同事或朋友中,很少有人会问为什么不必而且不能覆写start方法,仅仅就是因为“多线程应用就是这样写的”这个原因吗?
1700449537
1700449538
要说明这个问题,就需要看一下Thread类的源代码了。Thread类的start方法的代码如下。
1700449539
1700449540
public synchronized void start(){
1700449541
1700449542
//判断线程状态,必须是未启动状态
1700449543
1700449544
if(threadStatus!=0)
1700449545
1700449546
throw new IllegalThreadStateException();
1700449547
1700449548
//加入线程组中
1700449549
1700449550
group.add(this);
1700449551
1700449552
//分配栈内存,启动线程,运行run方法
1700449553
1700449554
start0();
1700449555
1700449556
//在启动前设置了停止状态
1700449557
1700449558
if(stopBeforeStart){
1700449559
1700449560
stop0(throwableFromStop);
[
上一页 ]
[ :1.700449511e+09 ]
[
下一页 ]