Java-类型线程的方法sleep(int)未定义

Java-类型线程的方法sleep(int)未定义,java,multithreading,Java,Multithreading,我得到一个错误:类型线程的方法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.ne

我得到一个错误:类型线程的方法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 ) {
        }
    }
}

您实现了自己的名为
Thread
的类,并尝试对其调用
sleep
,但失败了,因为类中未定义
sleep
。您的类基本上隐藏了java的
线程

以不同的方式调用您的类(例如,
MyThread
或者更好的
MyRunnable
,正如owlstead所指出的),或者直接调用
java.lang.Thread.sleep()

它不在您的
Thread
类中


因为您将类命名为
Thread
,所以Java将在这里查找
Thread.sleep
。如果您想要内置到Java中的函数,请尝试
Java.lang.Thread.sleep(time)
完全限定
线程
,因为您尝试使用的是
java.lang.Thread
,而不是您自己的。

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

之所以会出现这种情况,是因为您实现了自己的线程类。你们班没有睡眠法

首要的好处是避免使用标准Java库中的类名


如果您坚持保留这些名称,请使用java.lang.Thread.sleep(…)指定您想要java提供的Thread类。

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

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


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

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);
    }
}
这个程序看起来很简单,虽然有点讨厌。中的类
字符串
未命名包只是
java.lang.String
实例的包装器。看来 程序应打印Hello world
。如果你想运行这个程序, 你发现你不能。VM会发出如下错误消息:

Exception in thread "main" java.lang.NoSuchMethodError: main
如果您使用的是NetBeans IDE,那么程序将无法运行。您将收到消息未找到主类


VM找不到
main
方法,因为它不在那里。虽然
Main
有一个名为
Main
的方法,它的签名错误。主要方法 必须接受作为字符串数组的单个参数。怎么回事 VM很难告诉我们的是
Main.Main
接受一个字符串数组 类,它与
java.lang.String
没有任何关系



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

实际上,人们为什么不阅读生成的错误?我确实阅读了错误。这就是我复制并粘贴收到的错误消息的原因。您可以做的是在java文档中搜索该方法,然后自己找出它。不管怎么说,你找到了答案真是太好了:)谢谢大家!我要避免在类名+1中使用Java标准名:这是一个很好的例子,说明了为什么不应该给类命名为标准类。MyThread对于实现Runnable而不是线程的东西来说是一个奇怪的名称。您可以扩展线程并将其命名为MyThread,而不是Runnable(请参阅JavaDoc以了解线程如何运行)。请注意,要启动它,不要调用run(),而是调用start(),否则不会生成新线程。就我个人而言,我不会这样做,而是坚持使用Runnable。@owlstead可能在语义上不正确,但至少它可以编译
MyThread
只是一个例子。@Peter,我记得几年前主要在C#工作,有人在某个包中制作了一个重要的类字符串。当使用大写字母S(
String
)时,代码将不起作用,因为它引用了同一个包中的类,并且不是指
System.String
,而是XXX.String,并使用它与常规S(
String
)起作用。当然,我来自java,上课时使用大写字母。见鬼,这简直是胡说八道,我在调试中花了将近一个小时来解决简单的铸造问题。