[英]Unable to create an object of class which implements Runnable interface
我试图创建一个在main方法中实现Runnable接口的类的对象,并将这些对象传递给线程池。 但是IDE显示了读取非静态变量的错误,该错误不能从静态上下文中引用,即,我不能首先创建对象。 我无法弄清楚这段代码到底有什么问题。 其他所有东西都可以正常工作,但是仅这行代码显示了编译错误。 有人可以帮忙吗?
package threads;
import java.util.concurrent.*;
public class Tut5 {
public static void main(String[] args) {
ExecutorService exe = Executors.newFixedThreadPool(2);
for(int i=0; i<5; i++) {
Runner5 r5 = new Runner5(i);
exe.submit(r5);
}
exe.shutdown();
System.out.println("All tasks submitted.");
try {
exe.awaitTermination(1, TimeUnit.DAYS);
}
catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("All tasks completed.");
}
class Runner5 implements Runnable {
private int id;
public Runner5(int id) {
this.id = id;
}
public void run() {
System.out.println("Starting thread: " + id);
try{
Thread.sleep(3000);
}
catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("Ending thread: " + id);
}
}
}
你去@jtahlborn
当您在静态方法或块中使用非静态实例或方法时,会出现此错误。
main方法是static public static void main(String[] args)
因此它的简单性将导致错误。
在这里,您的class Runner5 implements Runnable
类是您要在静态main方法中访问的内部类,因此它会生成-
No enclosing instance of type Tut5 is accessible.
Must qualify the allocation with an enclosing instance of type Tut5
(e.g. x.new A() where x is an instance of Tut5).
您可以在Tut5
类之外定义此内部类,或将此Runner5
标记为静态。 或创建Tut5
类的实例并创建方法并放置其余代码。
谢谢
正如其他人回答,该Runner5
类是内部类的Tut5
。 这样,它需要实例化一个外部实例 。
如果您使Runner5成为静态类,它将成为不需要外部实例的静态嵌套类 。
static class Runner5 implements Runnable {
...
}
但是,正如其他人指出的那样,除非您正在对嵌套类进行练习,否则您应该将该类放在其自己的类文件中,或者您确定该类仅与Tut5类结合使用才有用,并且仅会被引用从那个班级。
请参阅http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html了解更多信息。
这里的问题是您无意中创建了一个内部类。 看来您是Java的初学者,而内部类是Java的相当高级的功能,所以我认为暂时最好避免使用它们。
在对Java更加自信之前,我建议您将每个类放入一个单独的文件中。 将Runner5
类的代码移动到单独的文件中,将该类public
并将其命名为Runner5.java
。 然后,您应该发现代码可以正常编译。
就目前而言,您的代码定义了一个Runner5
类, Runner5
属于您创建的Tut5
每个实例。 但是您永远不会创建Tut5
任何实例,因此不能创建任何属于它们的Runner5
。 如果将static
修饰符添加到Runner5
类,则内部类Runner5
将属于Tut5
类,而不是此类的实例。 然后,您将可以从您的main
方法中创建Runner5
。 但是,当您仍在学习Java时,建议您保持简单并暂时遵循“每文件一类”的规则。
最简单的解决方案是,只需将Runner5类复制到其自己的文件中。
除非您有很好的理由,否则我不明白为什么在这种情况下必须使用嵌套类,它不会改变任何内容(在显示的代码中)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.