代码之家  ›  专栏  ›  技术社区  ›  Greg

Java-访问静态方法Sleep-怎么了?

  •  7
  • Greg  · 技术社区  · 15 年前

    当我把下面的代码放到NetBeans中时,NetBeans会在它旁边给我一个警告,说“Accessing static method sleep”。

            try {
                Thread.currentThread().sleep(2000);
            }
            catch(InterruptedException ie){
                //continue
            }
    

    我做错什么了吗?我应该换个说法吗?我没有做任何多线程的事情。我只是有一个简单的主要方法,我想睡一会儿。

    6 回复  |  直到 15 年前
        1
  •  10
  •   John Vint    15 年前

    Thread.currentThread()返回Thread类的实例。当调用静态方法时,您只需要处理类本身。因此,在当前线程上调用静态方法时,如果在实例上调用该方法,将收到警告。

    你只要打个电话就行了 Thread.sleep(2000); Thread.currentThread.sleep(2000);

    要知道这一点很重要,因为人们在做以下事情时被烧伤:

    Thread a = new Thread(someRunnable);
    
    a.start();
    a.sleep(2000);  //this will sleep the current thread NOT a.
    

    Runnable someRunnable = new Runnable(){
        public void run(){
            Thread.sleep(2000);
        }
    };
    

    当“a”启动时,Thread.currentThread 在someRunnable中,run方法是“a”线程实例。

        2
  •  6
  •   Paul Tomblin    15 年前

    sleep 是静态的,所以你可以用 Thread.sleep(2000);

    从javadoc:

    睡觉(暂时停止执行) 对于指定数量的 任何监视器的所有权。

        3
  •  2
  •   stacker    15 年前

    Thread.currentThread().sleep(2000);
    

    与相同

    Thread.sleep(2000);
    
        4
  •  2
  •   MetroidFan2002    15 年前

    线程实例上没有对应于“sleep(long)”的方法。

    Thread.currentThread()睡眠(2000年);但是,由于thread类上有一个名为sleep()的方法具有长参数,因此无法编译。

    Java允许将此作为编译器时间技巧,以便新的程序员在对方法的静态访问感到困惑时可以执行此操作。

    但是,在编译器中,这实际上解决了:

    Thread.sleep(2000);

    以下代码也是等效的:

    t、 睡眠(2000年);

    警告的存在使您记住您访问的是类的静态方法,而不是实例变量的方法。

    要编写的适当代码总是Thread.sleep(2000); - 切勿通过实例访问静态方法,以避免混淆和此警告。

        5
  •  1
  •   Vivart    15 年前

    netbeans警告您,因为您是从线程引用而不是从线程类访问静态方法。

    try {
                Thread.sleep(2000);
            }
            catch(InterruptedException ie){
                //continue
            }
    

    sleep方法导致当前正在执行的线程sleep.So 不用打电话了Thread.currentThread().

        6
  •  1
  •   Jigar Joshi    15 年前

    当您试图使用object访问静态方法时,这不是最佳实践,NB会在那时发出警告,这里是相同的情况

    推荐文章