黑马程序员技术交流社区
标题: 匿名内部类和多线程问题 [打印本页]
作者: 未长法 时间: 2012-5-5 10:57
标题: 匿名内部类和多线程问题
new Thread(new Runnable(){ //匿名
public voidrun(){
System.out.println("runnablerun");
}
})
{
public voidrun(){
System.out.println("subthreadrun");
}
}.start(); //结果:subthreadrun
如果一个实现了两种多线程的方式,为什么先调用Thread.start()而不是调用Runnable中的start()方法?
作者: 倪杭乘 时间: 2012-5-5 11:08
你的start方法是跟在Thread类后面的,就是指定了Thread类的run方法开启线程
如果你要开启内部类的线程 就要调用Runnable().start()
作者: 崔仁军 时间: 2012-5-5 11:41
1 线程的实现有两种方式,第一种方式是继承Thread 类,然后重写run 方法;第二种是实现Runnable 接口,然后实现其run法。
2 Thread 类也实现了Runnable 接口,因此实现了Runnable 接口中的run 方法;
3 当使用第一种方式来生成线程对象时,我们需要重写run 方法,因为Thread 类的run方法此时什么事情也不做。
4 当使用第二种方式来生成线程对象时,我们需要实现Runnable 接口的run 方法,然后使用new Thread(new MyThread()) (假如MyThread 已经实现了Runnable 接口)来生成线程对象,这时的线程对象的run 方法就会调用MyThread 类的run 方法,这样我们自己编写的run 方法就执行了。
5 将我们希望线程执行的代码放到run 方法中,然后通过start 方法来启动线程,start方法首先为线程的执行准备好系统资源,然后再去调用 run 方法。
6 在Runnable接口中没有start这个方法所以只能用Thread中的start在调用线程
作者: 未长法 时间: 2012-5-5 15:21
到底是怎么回事啊,那个大师给解释解释啊?
作者: 韩慧阳 时间: 2012-5-6 10:36
其实很简单,我给你举个例子吧!
for(int i=0;i<5;i++)
{
printf("%d\n",i);
for(int j=0;j<5;j++)
{
printf(" %d",j);
}
printf("\n");
}
这个的输出结果是
0
0 1 2 3 4
1
0 1 2 3 4
...
...对吧。这个例子好像不太恰当。
对于嵌套而言,是不是该优先外层呢.
你写的那段如果无视中间的部分是不是就是new Thread(obj){.....}.start()啊,所以这个start是属于thread的。所以输出的是subThreadrun啊。
我是这么理解的!
作者: 韩新凯 时间: 2012-5-6 12:36
本帖最后由 韩新凯 于 2012-5-6 12:38 编辑
new Thread(new Runnable() { // 匿名
public void run() {
System.out.println("runnablerun");
}
}).start();//runnablerun,这样就可以了。
new Thread(){
public void run() {
System.out.println("subthreadrun");
}
}.start();//subthreadrun
作者: 黑马-王建雨 时间: 2012-5-6 13:07
你的start方法是跟在Thread类后面的,就是指定了运行Thread类的run方法中的代码。
如果你要开启内部类的线程, 就要运行内部类的run方法中的代码。
作者: 袁錦泰 时间: 2012-5-6 13:25
啷个里个郞 发表于 2012-5-6 13:07
你的start方法是跟在Thread类后面的,就是指定了运行Thread类的run方法中的代码。
如果你要开启内部类的线 ...
你可真聰明呀,找個給分的答案就複製,你複製過我的答案也就罷了,還有我同桌的答案你也複製啊? 這地方不適合投機取巧,謝謝...
作者: 黑马-王建雨 时间: 2012-5-6 13:34
袁錦泰 发表于 2012-5-6 13:25
你可真聰明呀,找個給分的答案就複製,你複製過我的答案也就罷了,還有我同桌的答案你也複製啊? 這地方不適 ...
正确答案是没有两个的。我是看了你的回答,可是我觉得我按自己对知识点的理解说的,而非机械式的复制。如果正确答案有两个的话,我当然会选择另一种答案、可答案是唯一的,无轮我们怎样回答,最后殊途同归一个答案。如果你介意我看过你的答案,我道歉。无心复制。谢谢。
作者: 袁錦泰 时间: 2012-5-6 13:40
啷个里个郞 发表于 2012-5-6 13:34
正确答案是没有两个的。我是看了你的回答,可是我觉得我按自己对知识点的理解说的,而非机械式的复制。如 ...
看來是我錯怪你了,是我道歉才對.
咱們都是初學者,對知識的理解最重要,學到是自己的,就這麼簡單...
作者: 徐慧书 时间: 2012-5-6 13:42
这就需要研究Thread类中的源代码了,在你重写run()方法时,你只有一个sysytem.out.println() 要知道Thread中的run方法是有代码的,你加上super.run();
后就会两个都打印了,那么super.run()方法中的代码是什么呢?
其实就是一个判断这个Thread类的对象有没有接受 Runable对象,若有则执行Runable的run方法,没有就不执行咯;
哦了
作者: 黑马-王建雨 时间: 2012-5-6 13:44
袁錦泰 发表于 2012-5-6 13:40
看來是我錯怪你了,是我道歉才對.
咱們都是初學者,對知識的理解最重要,學到是自己的,就這麼簡單... ...
谢谢理解。共同努力吧,为了梦想、黑马我们的践行梦想的第一站。加油。可以详聊哦:364674019.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |