Java-类型线程的方法sleep(int)未定义
我得到一个错误:类型线程的方法sleep(int)未定义。我认为sleep方法在Java的Thread类中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
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,上课时使用大写字母。见鬼,这简直是胡说八道,我在调试中花了将近一个小时来解决简单的铸造问题。