黑马程序员技术交流社区

标题: 大家好,最近学习问一个线程的小问题。 [打印本页]

作者: 余威宏    时间: 2013-5-27 19:01
标题: 大家好,最近学习问一个线程的小问题。
本帖最后由 余威宏 于 2013-5-27 22:00 编辑

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

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

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

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

作者: 821728010    时间: 2013-5-27 19:31
           run()方法中存放的是线程要执行的代码,只有run()方法是不行的,我们还需要start()来开启线程,start方法中调用了run().

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

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

           suspend ():用在线程得不到资源的时候,挂起线程(在外存),有资源时调用resume() 方法把它调入内存!
      
作者: Changer_s    时间: 2013-5-27 20:50
运行状态:cup只能执行一个线程(不断的切换线程,没有运行的,就处于临时状态,等待运行——————各线程运行的机会是平等的)
临时(阻塞)状态:具备运算资格,但是没有执行权(临时状态过了以后就到了 运行状态start())
冻结状态:放弃了执行资格
        (睡眠状态sleep(time)时间到了后就到了到了 临时状态 或者 等待状态wait(),notify()等待被唤醒到了  临时状态)
消亡状态:stop()或者 run方法结束。线程也就执行完了
作者: 紫衣侯    时间: 2013-5-27 21:40
run()方法只是一个类中的普通方法,直接执行和普通的方法没有两样;
start()方法则不同,它首先做了创建线程(初始化)等一系列工作,直接调用run方法不会启动线程
作者: 余威宏    时间: 2013-5-27 22:00
嗯好的,谢谢大家的解答哈!
作者: 土匪大学生    时间: 2013-5-27 23:06
标题: 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。这样的话,就会失去了多任务的功能,降低程序的运行效率。








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