A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于潇 中级黑马   /  2012-5-18 09:50  /  2860 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 于潇 于 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. };
复制代码
这段代码,我的运行结果是:

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

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1 - -! 哥们你这是调用方法,非启动线程啊~~.

查看全部评分

9 个回复

正序浏览
于潇 发表于 2012-5-18 12:00
额,看来我该再看看书了……

哈哈. 你这头像太吸引我的注意力了...
回复 使用道具 举报
你直接调用run()方法,线程根本就没有用上,那跟写个普通方法一样的,只有调用start()方法才是线程启动的唯一通道,
回复 使用道具 举报
清楚的记得是调用start()方法  要不不算线程启动
回复 使用道具 举报
线程的启动要调用start方法,然后start方法会自动调用你的run方法,你直接调用run方法就如同调用普通的方法是一样的,结果就是mt1先执行run方法,执行完了,mt2开始执行run方法。
回复 使用道具 举报
戴敏智 发表于 2012-5-18 11:07
启动线程是start()方法,如果写成run()方法,那么仅仅是对象调用了该方法,线程尽管创建了,但并没有运行。 ...

额,看来我该再看看书了……
回复 使用道具 举报
简单说一下个人看法哈,首先要明确多线程的执行是依靠什么来完成,它是依靠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方法。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
启动线程是start()方法,如果写成run()方法,那么仅仅是对象调用了该方法,线程尽管创建了,但并没有运行。如题中只存在一个线程(主线程).

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
要厚道。
run()方法改为start()方法即可。
start()方法才是开启线程。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
这个应该是因为资源占用的问题,如果 你在他们第次执行完后加一个sleep然后再加一个唤醒唤醒就可以了每次就可以达到交替执行的效果
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马