Java - 方法sleep(int)未定义Thread类型

时间:2011-12-21 14:50:57

标签: java multithreading

我收到错误:对于Thread类型,方法sleep(int)是未定义的。我认为sleep方法在Java中的Thread类中。

import java.util.Random;

public class Thread implements Runnable {

    String name;
    int time;
    Random r = new Random();

    public Thread(String s){
        name = s;
        time = r.nextInt(999);
    }

    public void run() {
        try{
            System.out.printf("%s is sleeping for %d\n", name, time);
            Thread.sleep(time);
            System.out.printf("%s is done", name);
        } catch(Exception e ) {
        }
    }
}

7 个答案:

答案 0 :(得分:18)

您实施了自己的名为Thread的类,并尝试在其上调用sleep,但失败了,因为您的班级中未定义sleep。你的课程基本上影响了java的Thread类。

以不同的方式打电话给您的班级(例如。MyThread或更好MyRunnable,如owlstead所述)或直接致电java.lang.Thread.sleep()

答案 1 :(得分:5)

它不在你的 Thread课程中。

由于您将类命名为Thread,因此Java将查找Thread.sleep。如果您想要内置于Java中的函数,请尝试java.lang.Thread.sleep(time);

答案 2 :(得分:2)

您的类名“Thread”与Java标准库中的Thread类冲突。更改班级的名称,它将解决所有问题。

答案 3 :(得分:2)

你得到这个的原因是你已经实现了自己的Thread类。在你班上没有睡眠方法。

首先要避免使用属于标准Java库的类名。

如果您坚持保留名称,请使用java.lang.Thread.sleep(...)指定您希望Java提供的Thread类。

答案 4 :(得分:1)

完全限定Thread,因为您尝试使用java.lang.Thread,而不是您自己的。{/ p>

答案 5 :(得分:1)

问题是您的类名为Thread,它没有sleep()方法。睡眠方法位于java.lana.Thread,您的班级正在隐藏它。

答案 6 :(得分:0)

这个问题的答案已经发布了另一个类比。它可能不是直接的答案,但可以帮助您消除混淆为什么避免重用平台类的名称,并且永远不要重用java.lang 中的类名,因为这些名称会自动导入到任何地方。 程序员习惯于以不合格的形式看到这些名称 自然地假设这些名称引用了java.lang中熟悉的类。如果 如果重用其中一个名称,则非限定名称将引用新定义 任何时候它都在自己的包装内使用。


一个名称可用于引用不同包中的多个类。以下简单的代码片段探讨了重用平台类名时会发生什么。你是什​​么 认为它呢?看它。它重用String包中的java.lang类。试一试。

package test;

final class String
{
    private final java.lang.String s;

    public String(java.lang.String s)
    {
        this.s = s;
    }

    @Override
    public java.lang.String toString()
    {
        return s;
    }
}

final public class Main
{
    public static void main(String[] args)
    {
        String s = new String("Hello world");
        System.out.println(s);
    }
}

这个程序看起来很简单,如果有点令人厌恶。中的班级String 未命名的包只是java.lang.String实例的包装器。它似乎 该程序应打印 Hello world 。但是,如果您尝试运行该程序, 你发现你做不到。 VM会发出如下错误消息:

Exception in thread "main" java.lang.NoSuchMethodError: main

如果您使用的是NetBeans IDE,则只会阻止该程序运行。您会收到消息找不到主要课程


VM无法找到main方法,因为它不存在。虽然 Main有一个名为main的方法,它的签名错误。一种主要方法 必须接受一个字符串数组的参数。什么的 VM很难告诉我们Main.main接受 我们的字符串 的数组 class,与java.lang.String没有任何关系。


结论:如上所述,请始终避免重复使用java.lang包中的平台类名称。