Java 无法创建实现可运行接口的类的对象
我试图创建一个类的对象,该类在main方法中实现Runnable接口,并将这些对象传递给线程池。但是IDE显示了读取非静态变量的错误,该变量不能从静态上下文引用,也就是说,我无法首先创建对象。我不知道这个代码到底出了什么问题。其他一切都可以正常工作,但只有这行代码显示编译错误。 有人能帮忙吗Java 无法创建实现可运行接口的类的对象,java,multithreading,Java,Multithreading,我试图创建一个类的对象,该类在main方法中实现Runnable接口,并将这些对象传递给线程池。但是IDE显示了读取非静态变量的错误,该变量不能从静态上下文引用,也就是说,我无法首先创建对象。我不知道这个代码到底出了什么问题。其他一切都可以正常工作,但只有这行代码显示编译错误。 有人能帮忙吗 package threads; import java.util.concurrent.*; public class Tut5 { public static void main(Stri
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);
}
}
}
包线程;
导入java.util.concurrent.*;
公共课Tut5{
公共静态void main(字符串[]args){
ExecutorService exe=Executors.newFixedThreadPool(2);
对于(int i=0;i
- 非静态变量不能从静态上下文引用此变量-
当您在静态方法或块中使用非静态实例或方法时,会出现此错误
而且main方法是static公共静态void main(String[]args)
所以它很简单,它将填充错误
在这里,您的类Runner5实现了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
类的实例,创建方法并放置其余代码
谢谢
- 非静态变量不能从静态上下文引用此变量-
当您在静态方法或块中使用非静态实例或方法时,会出现此错误
而且main方法是static公共静态void main(String[]args)
所以它很简单,它将填充错误
在这里,您的类Runner5实现了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
类的实例,创建方法并放置其余代码
谢谢这里的问题是您无意中创建了一个内部类。您似乎是Java的初学者,由于内部类是Java的一个相当高级的功能,我认为您最好暂时避免使用它们
在您对Java更有信心之前,我建议您将每个类放在一个单独的文件中。将Runner5
类的代码移动到一个单独的文件中,将该类公开
,并将其命名为Runner5.Java
。然后您应该会发现您的代码编译得很好
目前,您的代码定义了一个属于您创建的Tut5
的每个实例的类Runner5
。但是您从未创建过Tut5
的任何实例,因此无法创建属于它们的Runner5
类。如果您将static
修饰符添加到Runner5
类中,那么您的inner类Runner5
将属于Tut5
类,而不是此类的实例。然后,您可以从main
方法中创建Runner5
s。但是,由于您仍在学习Java,我建议保持简单,暂时坚持每个文件一类的规则。 这里的问题是您无意中创建了一个内部类。您似乎是Java的初学者,而且由于内部类是Java的一个相当高级的特性,我认为您最好暂时避免使用它们
在您对Java更有信心之前,我建议您将每个类放在一个单独的文件中。将Runner5
类的代码移动到一个单独的文件中,将该类公开
,并将其命名为Runner5.Java
。然后您应该会发现您的代码编译得很好
目前,您的代码定义了一个属于您创建的Tut5
的每个实例的类Runner5
。但是您从未创建过Tut5
的任何实例,因此无法创建属于它们的Runner5
类。如果您将static
修饰符添加到Runner5
类中,那么您的inner类Runner5
将属于Tut5
类,而不是此类的实例。然后,您可以从main
方法中创建Runner5
s。但是,由于您仍在学习Java,我建议保持简单,暂时坚持每个文件一类的规则。 最简单的解决方案就是将Runner5类复制到它自己的文件中
除非你有很好的理由,否则我不明白为什么要在这种情况下使用嵌套类,它不会改变任何东西(在你展示的代码中)。最简单的解决方案就是将Runner5类复制到它自己的文件中
除非你有很好的理由,否则我不明白你为什么要在这种情况下使用嵌套类,它不会改变任何东西(在你展示的代码中)。正如其他人回答的那样,Runner5
类是Tut5
的一个内部类。因此,它需要实例化一个外部实例
如果您使Runner5成为一个静态类,它将成为一个不需要外部实例的静态嵌套类
static class Runner5 implements Runnable {
...
}
但是,正如其他人所指出的,您应该将该类放在其自己的类文件中,除非您正在对嵌套类进行练习,或者您确定该类仅与类Tut5结合使用,并且只能从该类引用
请参阅以获得一些见解。正如其他人所回答的那样,Runner5
类是Tut5
的内部类。因此,它需要实例化一个外部实例
如果您使Runner5成为一个静态类,它将成为一个静态嵌套类,而