我正在尝试创建一个类的对象,该类在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
答案 0 :(得分:2)
当您在静态方法或块中使用非静态实例或方法时会出现此错误。
主要方法是静态的 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
类的实例并创建方法并放置其余代码。
由于
答案 1 :(得分:2)
正如其他人已经回答的那样,Runner5
类是Tut5
的内部类。因此,它需要实例化外部实例。
你使Runner5成为一个静态类,它变成了一个静态嵌套类,它不需要外部实例。
static class Runner5 implements Runnable {
...
}
但是,正如其他人已经注意到的那样,你应该将类放在它自己的类文件中,除非你正在对嵌套类进行练习,或者你确定该类只与Tut5类结合使用,并且只能从该类引用。
见http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html以获得一些见解。
答案 2 :(得分:0)
这里的问题是你无意中创建了一个内部类。看来你是Java的初学者,而且内部类是Java的一个相当高级的特性,我认为你最好暂时避开它们。
在您对Java更有信心之前,我建议您将每个类放入一个单独的文件中。将Runner5
类的代码移动到单独的文件中,创建类public
并将其命名为Runner5.java
。然后你应该发现你的代码编译得很好。
目前,您的代码定义了一个类Runner5
,它属于您创建的每个Tut5
实例。但是您永远不会创建Tut5
的任何实例,因此您无法创建属于它们的任何Runner5
。如果您将static
修饰符添加到Runner5
类,那么您的内部类Runner5
将属于Tut5
类,而不是此类的实例。然后,您就可以在Runner5
方法中创建main
s。但是,当你还在学习Java的时候,我建议你保持简单,并且暂时坚持每个文件的一级规则。
答案 3 :(得分:0)
最简单的解决方案,只需将Runner5类复制到自己的文件中即可。
除非你有充分的理由,否则我不明白为什么你必须在这种情况下使用嵌套类,它不会改变任何东西(在你展示的代码中)。