有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java创建和使用匿名可运行类的最佳方法

我想为Runnable使用一个匿名类。有两种方法,但我不知道它们是否做相同的事情:

方法一:直接使用Runnable,然后调用run()

new Runnable() {
    @Override
    public void run() {
    }
}.run();

方法二:使用start()方法而不是run()创建一个匿名Runnable并粘贴到Thread

new Thread(new Runnable() {
    @Override
    public void run() {
    }
}).start();

我认为方法二显然是正确的。但是,我不知道它是否和方法一做了相同的事情。我们可以直接在Runnable上调用run()方法吗


共 (6) 个答案

  1. # 1 楼答案

    正如其他人提到的,使用Thread类是正确的方法。然而,您还应该考虑使用Javas Executors框架来处理正在运行的线程

    Executors.newSingleThreadExecutor().execute(new Runnable() {
        @Override 
        public void run() {
            // code in here
        }
    });
    

    当然,直接使用线程是可以的。但一般建议(或首选)使用该框架。让Java为您处理好细节

  2. # 2 楼答案

    不,您通常不会直接在Runnable上调用run(),因为这样不会得到后台线程。如果你不想要也不需要后台线程,那么直接调用run(),但是如果你想创建一个后台线程并从其中运行你的Runnable,你必须创建一个新线程,然后将Runnable传入它的构造函数,并调用start()

    此外,还有其他完成此任务的方法,包括使用Executors和ExecutorServices,您应该研究它们的用途,因为它们比使用裸体线程对象提供了更大的灵活性和功能

    此外,您还想了解一下Future接口和FutureTasks类的用法,它们类似于Runnables,只允许您在完成时返回结果。如果您使用了SwingWorker,那么您已经使用了未来的接口,但没有意识到这一点

  3. # 3 楼答案

    我想补充一下这个讨论(你已经得到了很好的答案)
    如果您的可运行对象是无状态的,为了减少内存分配(占用时间+消耗一些内存——考虑一个应用程序极大地使用线程的情况),请考虑拥有一个静态字段来保存可运行对象。br/>

    private static Runnable runnable = new Runnable() { //Once again - do this only if this is a statelss object!
       public void run() {
       }
    } 
    
    //Use the runnable somewhere in the code
    
  4. # 4 楼答案

    在方法一中,它将像一个方法一样工作,作为可运行接口来实现和调用它,但不会创建后台线程。 事实上,当我们调用start方法时,它会导致响应线程开始执行,Java虚拟机会在内部调用该线程的run方法。因此,要启动线程,我们需要使用接口Runnable reference调用start方法。 在方法一中,我们甚至不能使用Runnable接口引用调用start方法,因为Runnable接口不支持start()方法。因此,必须创建Thread类的对象来启动线程执行

  5. # 5 楼答案

    请始终记住,Runnable只是您希望或能够在线程中运行的代码。匿名定义可运行代码的一种方法是:

      Runnable codeToRunOnThread=new Runnable() {
          @Override
          public void run() {
          //code to run in a thread you want
          }
      };
    

    然后你可以创建一个线程,并将你创建的Runnable传递给这个新线程,如下所示

      Thread myThread=new Thread(codeToRunOnThread);
      myThread.start();
    

    调用Thread类的start()方法后,run()方法中的代码将在新创建的线程上运行

    您还可以查看创建可运行对象的不同方式 here

  6. # 6 楼答案

    必须在Thread内执行Runnable接口。如果您想找到另一种内联方式,即Thread中的一段代码,请尝试:

    Thread t = new Thread()
    {
         public void run()
         {
            // put whatever code you want to run inside the thread here.
         }
    };
    
    t.start();