繁体   English   中英

无法创建实现Runnable接口的类的对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM