Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法创建实现可运行接口的类的对象_Java_Multithreading - Fatal编程技术网

Java 无法创建实现可运行接口的类的对象

Java 无法创建实现可运行接口的类的对象,java,multithreading,Java,Multithreading,我试图创建一个类的对象,该类在main方法中实现Runnable接口,并将这些对象传递给线程池。但是IDE显示了读取非静态变量的错误,该变量不能从静态上下文引用,也就是说,我无法首先创建对象。我不知道这个代码到底出了什么问题。其他一切都可以正常工作,但只有这行代码显示编译错误。 有人能帮忙吗 package threads; import java.util.concurrent.*; public class Tut5 { public static void main(Stri

我试图创建一个类的对象,该类在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);
        }
    }
}
包线程;
导入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成为一个静态类,它将成为一个静态嵌套类,而