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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 余威宏 于 2013-5-27 22:00 编辑

最近学习中遇到几个关于线程的小问题,有点不太明白请教一下大虾们。

为什么需要 run ()和 start ()方法,我们可以只用 run ()方法来完成任务吗?

还有的是Sleep ()、suspend ()和 wait ()之间有什么区别?

请大家详细解答一下,谢谢。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

5 个回复

倒序浏览
           run()方法中存放的是线程要执行的代码,只有run()方法是不行的,我们还需要start()来开启线程,start方法中调用了run().

           Sleep ():可以加参数,以毫秒为单位,到了时间线程会自动醒来!

           wait ():一般用在线程得不到资源的时候,使线程阻塞,必须调用notify() 把线程唤醒!(阻塞的进程还在内存中)。

           suspend ():用在线程得不到资源的时候,挂起线程(在外存),有资源时调用resume() 方法把它调入内存!
      

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
运行状态:cup只能执行一个线程(不断的切换线程,没有运行的,就处于临时状态,等待运行——————各线程运行的机会是平等的)
临时(阻塞)状态:具备运算资格,但是没有执行权(临时状态过了以后就到了 运行状态start())
冻结状态:放弃了执行资格
        (睡眠状态sleep(time)时间到了后就到了到了 临时状态 或者 等待状态wait(),notify()等待被唤醒到了  临时状态)
消亡状态:stop()或者 run方法结束。线程也就执行完了
回复 使用道具 举报
run()方法只是一个类中的普通方法,直接执行和普通的方法没有两样;
start()方法则不同,它首先做了创建线程(初始化)等一系列工作,直接调用run方法不会启动线程
回复 使用道具 举报
嗯好的,谢谢大家的解答哈!
回复 使用道具 举报

RE: 为什么需要 run ()和 start ()方法,我们可以只用 run ()方...

答案是肯定不可以的啦。(除非你的需求是单线程)因为CPU(多核除外)在某一时刻只能执行一个线程。
如下程序:


class ThreadTest2
{
        public static void main(String[] args)
        {       

                SubThread1 t2=new SubThread1();
                SubThread1 t3=new SubThread1();
                t2.start();//开启一个新线程
                t3.start();//开启一个新线程

//                t2.run();//调用对象t2的run()
//                t3.run();//调用对象t3的run()
//                System.out.println("Hello World!");
        }
}

class SubThread1 extends Thread  //定义一个SubThread1且继承Thread,重写run()方法。
{
        public void run()
        {
                int a=0;
                while(a<10)
                {
                        ++a;
                        System.out.println(Thread.currentThread()+"---------"+a);
                }
        }
}



当调用start()时 ,运行结果是



当调用 run()时运行结果是:



所以,start()与run()的区别:
1、当调用start()时JVM会创建一个新的线程,会与main线程共享cpu资源。即按一定的规则轮流享用cpu。
2、当调用run()时jvm不会创建一个新线程,只把它看做普通的类成员方法来执行。
3、当while(a<10) 中的a很大时,若不调用start()来执行程序,则可能 需要很长时间来执行t2,然后再执行t3。这样的话,就会失去了多任务的功能,降低程序的运行效率。



评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

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