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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 岳伟伟 初级黑马   /  2012-4-26 09:55  /  1922 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1、定义一个类Rrr实现Runnable()接口,重写run()方法;
2、定义一个类Ttt继承Thread类,重写构造方法Ttt(Runnable p),重写run()方法;
3、创建Rrr类的对象r,利用r创建新线程t;
4、t.start();
会运行哪个run呢?

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

8 个回复

倒序浏览
1,必须实现run
2,Ttt重写构造方法,你是怎么实现构造方法的,如果你没有调用super(Runnable p),那么肯定不会运行Rrr中的run方法
   重写run方法,new Ttt后,start->run,所以必须执行到你重写的run方法中,然后如果你不调用super.run(),依然没法运行Rrr中的run方法
这是一条程序链,两个run并没有实质性的互斥性。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
这个很好回答,
如果你覆写了Thread中的run和也写了个带runnable参数的构造函数,那你创建一个实现Runnable接口的实现类就没必要了,因为Thread的run方法中是调用传入的Runnable的run方法;

  1. public class Demo1 {
  2.         public static void main(String[] args) {
  3.                 //new MyThread().start();
  4.                 new MyThread(new MyRun()).start();
  5.         }
  6. }
  7. class MyThread extends Thread{
  8.         MyThread(Runnable r){
  9.                 //代码略。。
  10.         }
  11.         public void run(){
  12.                 System.out.println("MyThread....run");//原Thread的run方法是调用Runnable r的run方法;
  13.         }
  14.        
  15. }
  16. class MyRun implements Runnable{

  17.         @Override
  18.         public void run() {
  19.                 System.out.println("MyRun.....run");
  20.         }
  21.        
  22. }
复制代码
回复 使用道具 举报
高彰谦 发表于 2012-4-26 11:20
1,必须实现run
2,Ttt重写构造方法,你是怎么实现构造方法的,如果你没有调用super(Runnable p),那么肯定不 ...

Ttt的构造方法是
Ttt(){
    super();
}
Ttt(Runnable r){
      super( r);
}
这样建了Rrr的对象r,用Ttt(r)创建新的Ttt对象t,
t.start();

早上出门匆忙,没表达清楚~
回复 使用道具 举报
林德燚 发表于 2012-4-26 12:03
这个很好回答,
如果你覆写了Thread中的run和也写了个带runnable参数的构造函数,那你创建一个实现Runnable ...

就是这个意思,不过我设想的构造方法是
MyThread(Runnable r){
    super(r);
}
这样可行吗?

你这段代码写得真不错,我晚上回去试试。~谢谢!
回复 使用道具 举报
岳伟伟 发表于 2012-4-26 12:47
Ttt的构造方法是
Ttt(){
    super();

还有一个关键的就是Ttt的run方法你是怎么重写的啊
回复 使用道具 举报
岳伟伟 发表于 2012-4-26 12:49
就是这个意思,不过我设想的构造方法是
MyThread(Runnable r){
    super(r);

可以,都是调用MyThread的run方法,只要你run方法没有调用Runnable r的run方法就不会执行r的run方法;
回复 使用道具 举报
高彰谦 发表于 2012-4-26 12:56
还有一个关键的就是Ttt的run方法你是怎么重写的啊

public void run(){

                System.out.println("Ttt....run");//原Thread的run方法是调用Runnable r的run方法;

        }

这样OK吗?
回复 使用道具 举报
本帖最后由 韩新凯 于 2012-4-26 23:34 编辑

感觉这个程序很有意思,有兴趣的朋友看看,跟楼主的问题没有太大关系。
package test;
class MyThread extends Thread {
MyThread(Runnable r) {
  // 代码略。。
  r.run();
}
public MyThread() {
  // TODO Auto-generated constructor stub
  run();
}
public void run() {
  System.out.println("MyThread....run");// 原Thread的run方法是调用Runnable
            // r的run方法;
}
}
class MyRun implements Runnable {
@Override
public void run() {
  System.out.println("MyRun.....run");
}
}
public class Demo1 {
public static void main(String[] args) {
  new MyThread().start();
  new MyThread(new MyRun()).start();
}
}
运行结果:
MyThread....run
MyThread....run
MyRun.....run
MyThread....run

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