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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李龙涛 黑马帝   /  2011-7-23 23:43  /  2133 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在看张老师的视频教程中经常遇到这种问题
import java.util.*;
import javax.management.*;
public class TestTimerTask {
        public static void main(String[] args) {
                class MyTimerTask extends TimerTask
                {
                        private Timer tm=null;
                        public MyTimerTask(Timer tm)
                        {
                                this.tm=tm;
                        }
                        public void run()
                        {
                                try{
                                Runtime.getRuntime().exec("calc.exe");
                                }catch(Exception e)
                                {
                                        e.printStackTrace();
                                }
                                //结束任务线程的代码
                                tm.cancel();
                        }
                }
                Timer tm=new Timer();
                tm.schedule(new MyTimerTask(tm),5000);
        }
}

schedule(TimerTask task,long delay)
我知道在schedule方法中要传递进去一个TimerTask对象
问题1:为什么要定义一个TimerTask的子类呢?为什么这个子类要定义为内部类呢?
问题2:这个TimerTask对象为什么还要传递进去一个Timer对象呢?
问题3:为什么还要在TimerTask子类中定义一个Timer的构造函数呢?而且还要传递进去一个Timer类型的引用变量呢?
问题4:Timer tm=null;这句也理解不了
也许对于高手来说这些问题都很容易 但是相信对于我或者跟我一样的初学者来说 经常遇到这种问题 例如多线程同步中也有遇到类似的问题,请高手们赐教
[ 本帖最后由 李龙涛 于 2011-07-23  23:47 编辑 ]

评分

参与人数 1技术分 +4 收起 理由
小龙 + 4 不错的童鞋!

查看全部评分

3 个回复

倒序浏览
黑马网友  发表于 2011-7-23 23:49:33
沙发
管理员多给点分呀 这个问题相信是很多初学者都一时难以理解的
回复 使用道具 举报
问题1. TimerTask定义为子类的原因是为了复写父类的方法(本例中为fun()方法)。
1.2  (a)如果一个类只在另一个类中用到了,那就可以把它声明为这另一个类的内部类(本例中为MyTimerTask )。
    (b)不想被除了外部类的类访问,这也是内部类的好处,
    (c)也为了程序的高内聚,低耦合。
问题2.是为了实例化MyTimerTask 对象。
问题3.构造函数中传递进去一个Timer对象的原因是为了实例化Timer对象。
问题4.private Timer tm=null; 是初始化成员变量tm。

PS:文笔不好,别笑。
[ 本帖最后由 那日苏 于 2011-07-24  00:46 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
小龙 + 2

查看全部评分

回复 使用道具 举报
尽我所能,解释一些,大家多多补充!
一、
1.内部类是程序更具模块化,更紧凑;
2.TimerTask是一个abstract类,要用它必须定义它的一个子类;
二、
Timer对象表示schedule delay in milliseconds的时间,因为Timer有schedule(TimerTask task, long delay)这样一个方法,需要传递进去一个参数,详见JDK中Timer类的schedule方法,不知道能不能缺省?
三、
定义public MyTimerTask(Timer tm)方法是为了把Timer获得的值传递给自己的变量;
四、
赋予一个空值,应该是出于安全方面的考虑。
[ 本帖最后由 孙斌 于 2011-07-24  00:51 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
小龙 + 2 答题有分!

查看全部评分

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