代码片段如下:TimerTask task = new TimerTask() { public void run() {

    try 
    {
doWhat(); //我想在这里可以得到传值     }     catch (IOException e) 
    {
System.err.println(e);
    }
         }
};Timer timer = new Timer();timer.schedule(task,date);//doWhat()定期执行因为inner class的问题无法对run()中的参数进行传值,求教如何修改代码可以实现传值?

解决方案 »

  1.   

    你是想从doWhat(); 中传回值?
      

  2.   

    设置一个单例配置参数类,main里设置好参数,所有地方都可以访问他比如:class SysPara{
    private static SysPara sysPara;private SysPara(){Load();}private String para1;
    private String para2;
    ....public static synchronized SysPara getInstance(){
    if ( sysPara == null ){
    sysPara = new SysPara();
    }
    return sysPara ;
    }
    ....
    }
      

  3.   

    to jihanzhong(逍遥) :
    谢谢
    但是我的inner class是写在servlet的doPost里的
    servlet本身没有main函数,你所说的方法还可以实现吗?
      

  4.   

    一定要用匿名类来实现 TimerTask 吗?定义一个完整的类不就简单了吗?
      

  5.   

    你在servlet 的init里初始化他,或者干脆不要初始化,直接他的load里自己去取配置
      

  6.   

    我把你的class SysPara写进init后编译显示:
    TestServlet.java:31: inner classes cannot have static declarations
                                    private static SysPara sysPara;
                                                           ^
    TestServlet.java:33: cannot find symbol
    symbol  : method Load()
    location: class SysPara
                                    private SysPara(){Load();}
                                                      ^
    TestServlet.java:44: non-static variable this cannot be referenced from a static
     context
                                            sysPara = new SysPara();好象还是因为innner class的问题使它不能初始化
                                                      ^
      

  7.   

    to maquan('ma:kju) :
    谢谢 我试着把代码改成...
    class Task extends TimerTask
    {
         public void run() {

        try 
        {
    doWhat(); //我想在这里可以得到传值     }     catch (IOException e) 
        {
    System.err.println(e);
        }
             }
    }Timer timer = new Timer();
    timer.schedule(new Task,date);//doWhat()定期执行
    ...问题依旧,你指的是不是把class Task单独写成一个.java文件后编译呢?
    这样的话是不是要做成package来import呢?
      

  8.   

    class SysPara 是一个单独的.java文件啊!
    在你的inner里使用他: SysPara.getInstance.getParaX();
      

  9.   

    to  jihanzhong(逍遥) : 我的class SysPara编译时报错:
    SysPara.java:8: cannot find symbol
    symbol  : method Load()
    location: class SysPara
                                    {Load();}
                                     ^
    这个类需要import什么包吗?
      

  10.   

    TimerTask task = new TimerTask() { public void run() {
        getXXXX();//在程序寄托的类里定义一个getXXXX()函数就可以把值传进来了
        try 
        {
    doWhat(); //我想在这里可以得到传值     }     catch (IOException e) 
        {
    System.err.println(e);
        }
             }
    };Timer timer = new Timer();
    timer.schedule(task,date);
    不知道这样可以实现功能不
      

  11.   

    doWhat(); //我想在这里可以得到传值 外围类.this.xxx;
      

  12.   

    我想是这样,首先写一个 class,不用单独的 .java 文件,就在你的 servlet 那个 .java 文件里就可以(一个 .java 里可以定义多个 class,只有一个是 public 的,这个应该知道吧),通过这个 class 的 constructor 把参数传给它:public class MyServlet extends Servlet {
        doPost(HttpServletRequest req, HttpServletResponse resp) {
            ……
            Timer timer = new Timer();
            timer.schedule(new Task(99), date);
            ……
        }
    }class Task extends TimerTask
    {
        private int param;
        public Task(int param) { this.param = param; }
        public void run() {
            try  {
                doWhat(param);
            } catch (IOException e) {
                System.err.println(e);
            }
        }
        ……
    }BTW: 你原来那种写法不叫 Inner Class,应该叫 Anonymous Class。
      

  13.   

    To maquan('ma:kju):的确 之前我写的是Anonymous Class修改成你定义的这个class Task后还有点问题我想这个Task应该是inner class吧它里边的param可以使用req.getParameter("")从jsp页面传值吗?好象也不行 报错是inner class问题 只有class Task里定义的参数才能读到
      

  14.   

    To maquan('ma:kju):"通过这个 class 的 constructor 把参数传给它"还有这句的意思我不太明白,能说明下么?谢谢
      

  15.   

    To hubo2003hq(rain):"getXXXX();//在程序寄托的类里定义一个getXXXX()函数就可以把值传进来了"这里不太明白比如在我的inner class之外定义了 String taskname = request.getParameter("task");要如何才能利用getXXX();在run()里得到这个taskname参数呢?
      

  16.   

    class A
    {
    String taskname = request.getParameter("task");
    public String getTaskname()
    {
        return this.taskname;
    }
    public void XXX()
    {
    TimerTask task = new TimerTask() {public void run() {    try 
        {
    getTaskname();//传了你想要的值
    doWhat(getTaskname()); //我想在这里可以得到传值    }    catch (IOException e) 
        {
    System.err.println(e);
        }
             }
    };
    Timer timer = new Timer();
    timer.schedule(task,date);
    }
    }
      

  17.   

    我说的那种用法不是 Inner Class,关于 Inner Class,请参考这个网址的内容:
        http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3关于 Class 的类型,有下面几个说法,比较容易混淆,最好仔细弄清楚(它们不是并列的概念):
        Anonymous Class
        Inner Class
        Member Class
        Nested Class而我说的 Class,并不是上面这些“特殊”的 Class 类型,而只是“普通”的 Class,唯一有点特别的是,它不是占据一个单独的 .java 文件,而是写在 MyServlet.java 文件里面,跟 MyServlet 并列。
    至于你说的要把从 HTTP request 里面得到的参数传给它,就可以像下面这样做(以下内容都在 MyServlet.java 文件中):public class MyServlet extends HttpServlet {
        void doPost(HttpServletRequest req, HttpServletResponse resp) {
            ……
            Timer timer = new Timer();
            timer.schedule(new Task( req.getParameter("id") ), date);
            ……
        }
    }class Task extends TimerTask
    {
        private String param;
        public Task(String param) { this.param = param; }
        public void run() {
            try  {
                doWhat(param);
            } catch (IOException e) {
                System.err.println(e);
            }
        }
        ……
    }
      

  18.   

    TO treeroot(旗鲁特):你说的“外围类.this.xxx;”,一般来说,应该可以用这个方法访问到外围类的内容,但对于本贴的这个问题来说,内嵌类是延迟执行的,而外围类又是一个 servlet,由于 servlet 实例的重用,恐怕实际访问到的内容已经不是当初期望的东西了吧?不知道我这么理解对不对?
      

  19.   

    To hubo2003hq(rain) :
    不知道为什么我定义了
    public String getTaskname()
    {
        return this.taskname;
    }
    后编译时这里报错: illegal start of expression还有在doWhat(getTaskname()); 
    这里也报错:invalid method declaration; return type required
      

  20.   

    To maquan('ma:kju) :
    /*
    你说的“外围类.this.xxx;”,一般来说,应该可以用这个方法访问到外围类的内容,但对于本贴的这个问题来说,内嵌类是延迟执行的,而外围类又是一个 servlet,由于 servlet 实例的重用,恐怕实际访问到的内容已经不是当初期望的东西了吧?
    */对的,是可能存在servlet实例重用问题.你所说的类的使用我明白了,但还有一点不清楚,这个"普通"类class Task能否得到doPost定义的String的传值?比如doPost里有String name = request.getParameter("ID");能否实现在run()里的system.out.println(name);? 
      

  21.   

    > 你所说的类的使用我明白了,但还有一点不清楚,这个"普通"类class Task能否得到doPost定义的String的传值?
    > 比如doPost里有String name = request.getParameter("ID");
    > 能否实现在run()里的system.out.println(name);?我前面“2006-7-20 16:32:47”发的帖子不就是把一个字符串传到 Task 对象里去,然后在 run() 里使用的吗?