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

时间:2012-04-29 04:04:06

标签: java multithreading

我正在尝试创建一个类的对象,该类在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 个答案:

答案 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类复制到自己的文件中即可。

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