黑马程序员技术交流社区

标题: 多线程启动顺序问题 [打印本页]

作者: 于潇    时间: 2012-5-18 09:50
标题: 多线程启动顺序问题
本帖最后由 于潇 于 2012-5-18 09:51 编辑

  1. class MyThread extends Thread
  2. {
  3. private String name ;
  4. public MyThread(String name){
  5. this.name = name ;
  6. }
  7. public void run()
  8. {
  9. for(int i=0;i<10;i++)
  10. {
  11. System.out.println(name + "运行,i = " + i) ;
  12. }
  13. }
  14. };
  15. public class Thread01{
  16. public static void main(String args[]){
  17. MyThread mt1 = new MyThread("线程A ") ;
  18. MyThread mt2 = new MyThread("线程B ") ;
  19. mt1.run() ;
  20. mt2.run() ;
  21. }
  22. };
复制代码
这段代码,我的运行结果是:

两个线程没有交替运行,反而顺序执行?


作者: kevindavid    时间: 2012-5-18 09:55
这个应该是因为资源占用的问题,如果 你在他们第次执行完后加一个sleep然后再加一个唤醒唤醒就可以了每次就可以达到交替执行的效果
作者: 李哲    时间: 2012-5-18 09:55
要厚道。
run()方法改为start()方法即可。
start()方法才是开启线程。

作者: 戴敏智    时间: 2012-5-18 11:07
启动线程是start()方法,如果写成run()方法,那么仅仅是对象调用了该方法,线程尽管创建了,但并没有运行。如题中只存在一个线程(主线程).
作者: 李保成    时间: 2012-5-18 11:21
简单说一下个人看法哈,首先要明确多线程的执行是依靠什么来完成,它是依靠CPU的来回切换完成。只有该线程拿到了CPU的执行权才会执行对应的代码,但是因为CPU处理速度非常快,所以CPU有可能在这段时间内刚好将其对应的代码处理完成,进而处理下边的线程。

在你程序中犯了一个很严重的错误,你没有搞清楚run()跟start()是用来做什么的。建议好好看看多线程这一章。
一般线程的创建和执行有两种方式,一种继承thread类,另一种是实现接口Runnable接口,但是不管哪种都是要覆盖其中的run()方法,使用start()开启线程。
MyThread mt1 = new MyThread("线程A ") ;

MyThread mt2 = new MyThread("线程B ") ;

mt1.run() ;

mt2.run() ;

因为这里没有启动线程,所以相当于主线程执行了new MyThread()中的run方法。
作者: 于潇    时间: 2012-5-18 12:00
戴敏智 发表于 2012-5-18 11:07
启动线程是start()方法,如果写成run()方法,那么仅仅是对象调用了该方法,线程尽管创建了,但并没有运行。 ...

额,看来我该再看看书了……
作者: 何拴绪    时间: 2012-5-18 13:23
线程的启动要调用start方法,然后start方法会自动调用你的run方法,你直接调用run方法就如同调用普通的方法是一样的,结果就是mt1先执行run方法,执行完了,mt2开始执行run方法。
作者: 陌花╮有意、    时间: 2012-5-18 14:17
清楚的记得是调用start()方法  要不不算线程启动
作者: 8161776    时间: 2012-5-19 00:13
你直接调用run()方法,线程根本就没有用上,那跟写个普通方法一样的,只有调用start()方法才是线程启动的唯一通道,
作者: 袁錦泰    时间: 2012-5-19 00:40
于潇 发表于 2012-5-18 12:00
额,看来我该再看看书了……

哈哈. 你这头像太吸引我的注意力了...




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2