2

我正在尝试创建一个在 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

4

4 回答 4

2
  • 非静态变量 this 不能从静态上下文中引用 -

当您在静态方法或块中使用非静态实例或方法时会出现此错误。

主要方法是静态 的,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并创建一个方法并放置其余代码。

谢谢

于 2012-04-29T04:17:20.640 回答
2

正如其他人所回答的那样Runner5该类是. 因此,它需要一个外部实例来实例化。Tut5

如果您使 Runner5 成为静态类,它就会成为不需要外部实例的静态嵌套类。

static class Runner5 implements Runnable {
...
}

但是,正如其他人所指出的,您应该将该类放在它自己的类文件中,除非您正在对嵌套类进行练习,或者您确定该类仅与类 Tut5 结合使用,并且只会被引用从那个班级。

有关一些见解,请参见http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

于 2012-04-29T08:11:48.337 回答
0

这里的问题是您无意中创建了一个内部类。看来您是 Java 的初学者,并且由于内部类是 Java 的一个相当高级的功能,我认为您最好暂时避免使用它们。

在您对 Java 更有信心之前,我建议您将每个类放入一个单独的文件中。将你的Runner5类的代码移动到一个单独的文件中,创建类public并命名它Runner5.java。然后你应该会发现你的代码编译得很好。

就目前而言,您的代码定义了一个Runner5属于Tut5您创建的每个实例的类。但是您永远不会创建 的任何实例Tut5,因此您无法创建任何Runner5属于它们的 s。如果您将static修饰符添加到您的Runner5类,那么您的内部类Runner5将属于Tut5该类而不是该类的实例。然后,您将能够Runner5从您的main方法中创建 s。但是,由于您仍在学习 Java,我建议您暂时保持简单并坚持每个文件一个类的规则。

于 2012-04-29T07:28:02.600 回答
0

最简单的解决方案,只需将 Runner5 类复制到自己的文件中即可。

除非您有充分的理由,否则我不明白为什么必须在这种情况下使用嵌套类,它不会改变任何东西(在您显示的代码中)。

于 2012-04-29T07:29:00.207 回答