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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴林飞 中级黑马   /  2012-11-15 13:21  /  1699 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴林飞 于 2012-11-15 14:01 编辑

class TestThread extends Thread
{
        private String name;
        TestThread(String name)
        {
                this.name = name;
        }
        public void run()
        {
                for(int x=0;x<60;x++)
                        System.out.println(name+"..."+x);
        }
}

class  MainThread
{
        public static void main(String[] args)
        {
                TestThread t1 = new TestThread("线程1");
                TestThread t2 = new TestThread("线程2");
                t1.start();
                t2.start();
                for(int x=0;x<60;x++)
                                                System.out.println("主函数运行........"+x);//这个显示结果是主线程,线程1,线程2交替运行。
                        //System.out.println("主函数运行........");   这里我自己练习的时候少打了一个x结果显示的是主函数先运行一直到结束,然后是线程1和2交替运行,重复几次都是这种情况,不知道为什么出现这种结果。谁能帮忙解释一下。
        }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
这个和你的计算机属性有关系。每台计算机的运行效率都不一样的,放在你的计算机上是这样
放在别人的计算机上不一定是这样的。我的理解是,可能你少写了一个x,你的计算机在执行主函数循环的时候速度就更快了,
t1和t2获取到了执行资格,但是没有抢到执行权,而主函数就把循环结束了。如果你把主函数的
循环次数再增大到一定程度,应该可以看到交替运行的情况的。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
for(int x=0;x<60;x++)
           //System.out.println("主函数运行........");   没有调用其他属性,仅仅执行一个打印过程,执行速度快,所以很容易在获得执行权后就立即执行完

          System.out.println("主函数运行........"+x);//加了x后,主函数线程需要反复调用x变量,影响了执行速度,所以在它还没执行完时,t1或t2抢到了执行权

你可以通过在线程中加入Thread.sleep(long millis);方法,看看线程的执行特点。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我觉得这个和一楼说的很像,应该是你电脑的问题。就算没有最后那个主函数输出语句,光有两个线程在执行的话你看到的输出应该也不是真正的一个执行完了就切换另一个吧。应该会出现一个线程打印了好几个数字另一个线程才抢到执行权吧。这个线程并发执行并不是所谓的真正的并发执行,而且多线程执行的时候是随机的。你可以多运行几次,看到的打印的数字每次都是不一样的吧。。我建议你把主函数的循环结束条件放大一些,然后在执行试试。
回复 使用道具 举报
黑马吕世成 来自手机 中级黑马 2012-11-15 23:56:00
报纸
吴林飞 发表于 2012-11-15 13:21:32
本帖最后由 吴林飞 于 2012-11-15 14:01 编辑

class TestThread extends Thread
{
        private String name;

线程调用start方法并没有启动,此时处于Runnable 状态。只有获得cpu时间片,才能开始运行。而cpu分配时间是随机不确定的,所以运行结果也不确定,如果非要达到自己预想的结果,就加一个sleep,让主程序释放cpu资源,从而使别的线程进入运行状态。来自: Android客户端
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马