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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 创出一片辉煌 中级黑马   /  2012-8-1 21:55  /  2157 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class MyThread implements Runnable{ // 实现Runnable接口
public void run(){ // 覆写run()方法
  for(int i=0;i<3;i++){
   System.out.println(Thread.currentThread().getName()
     + "运行,i = " + i) ; // 取得当前线程的名字
  }
}
};
public class CurrentThreadDemo{
public static void main(String args[]){
  MyThread mt = new MyThread() ; // 实例化Runnable子类对象
  new Thread(mt,"线程").start() ;  // 启动线程
  mt.run() ;
}
};
在书上例题看到这么个例子!书上解释说是主方法调用线程!主方法是个线程的形式!
但是运行结果是:
线程运行, i = 0
线程运行, i = 1
线程运行, i = 2
main运行, i = 0
main运行, i = 1
main运行, i = 2
如果主方法调用的是线程为什么要等到“线程”运行完再运行“main”的呢?为什么不是并行运行?
还有就是主方法都是以线程的形式出现,那么java运行时到底启动多少个线程呢??多线程这块好难懂

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
你的运行结果应该是多线程中出现的一种情况而已,不能说明是到等到“线程”运行完再运行“main”,你可以多运行几次,对比下运行后的结果,在将打印次数值大一些,就可以看到线程交替运行了
main运行,i = 0
线程运行,i = 0
main运行,i = 1
线程运行,i = 1
main运行,i = 2
线程运行,i = 2
main运行,i = 3
线程运行,i = 3
线程运行,i = 4
线程运行,i = 5
线程运行,i = 6
线程运行,i = 7
线程运行,i = 8
线程运行,i = 9
线程运行,i = 10
线程运行,i = 11
线程运行,i = 12
线程运行,i = 13
线程运行,i = 14
线程运行,i = 15
线程运行,i = 16
线程运行,i = 17
线程运行,i = 18
线程运行,i = 19
main运行,i = 4
main运行,i = 5
main运行,i = 6
main运行,i = 7
main运行,i = 8
main运行,i = 9
main运行,i = 10
main运行,i = 11
main运行,i = 12
main运行,i = 13
main运行,i = 14
main运行,i = 15
main运行,i = 16
main运行,i = 17
main运行,i = 18
main运行,i = 19
java运行时到底启动多少线程,主线程+自定义线程+后台线程(垃圾回收),还有什么线程就不用特别清楚了。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
多运行几次这个程序,就会有不同的效果,比如
main运行,i = 0
线程运行,i = 0
main运行,i = 1
线程运行,i = 1

如果在主函数中直接加一个for循环,效果会更好,更容易理解,线程要多运行几次,才能有效果
main运行,i = 2
线程运行,i = 2
回复 使用道具 举报
··                   已解决
回复 使用道具 举报
其实你那个线程是没有顺序的,因为多个线程在同时执行,cpu在多个线程之间随机切换,随机性造成了结果的没规律。多线程其实就是cpu在多个线程之间进行切换导致的。没有真正的顺序。你可以尝试一下多运行几次,运行结果就如下面所示了:
第一次运行:
main运行,i = 0
main运行,i = 1
main运行,i = 2
线程运行,i = 0
线程运行,i = 1
线程运行,i = 2

第二次运行:
线程运行,i = 0
main运行,i = 0
main运行,i = 1
main运行,i = 2
线程运行,i = 1
线程运行,i = 2

第三次运行:
线程运行,i = 0
线程运行,i = 1
线程运行,i = 2
main运行,i = 0
main运行,i = 1
main运行,i = 2

如果你在线程中间加上sleep()语句,你会看的更清楚,更改后的代码如下:
package cn.itcast.Test;

public class Test
{
        public static void main(String args[])
        {
                MyThread mt = new MyThread(); // 实例化Runnable子类对象
                new Thread(mt, "线程").start(); // 启动线程
                mt.run();
        }
}

class MyThread implements Runnable
{ // 实现Runnable接口
        public void run()
        { // 覆写run()方法
                for (int i = 0; i < 3; i++)
                {
                        try
                        {
                                Thread.sleep(10);
                        }
                        catch (Exception e)
                        {
                                // TODO: handle exception
                        }
                        System.out.println(Thread.currentThread().getName() + "运行,i = " + i); // 取得当前线程的名字
                }
        }
}

打印结果如下:
第一次:
main运行,i = 0
线程运行,i = 0
线程运行,i = 1
main运行,i = 1
线程运行,i = 2
main运行,i = 2


第二次:
线程运行,i = 0
main运行,i = 0
main运行,i = 1
线程运行,i = 1
线程运行,i = 2
main运行,i = 2

这样的话就明显了,sleep()是让程序暂停一下。

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1 很给力!继续加油!

查看全部评分

回复 使用道具 举报
刘向阳 发表于 2012-8-1 22:31
你的运行结果应该是多线程中出现的一种情况而已,不能说明是到等到“线程”运行完再运行“main”,你可以多 ...

``            已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马