【问题标题】:Create threads in java to run in background在java中创建线程以在后台运行
【发布时间】:2012-09-23 10:23:28
【问题描述】:

我想从我的主 java 程序中生成一个 Java 线程,并且该线程应该单独执行而不干扰主程序。应该是这样的:

  1. 用户启动的主程序
  2. 做一些业务工作,应该创建一个可以处理后台进程的新线程
  3. 一旦创建线程,主程序不应等到生成的线程完成。事实上它应该是无缝的..

【问题讨论】:

标签: java multithreading


【解决方案1】:

一种直接的方法是自己手动生成线程:

public static void main(String[] args) {

     Runnable r = new Runnable() {
         public void run() {
             runYourBackgroundTaskHere();
         }
     };

     new Thread(r).start();
     //this line will execute immediately, not waiting for your task to complete
}

或者,如果您需要生成多个线程或需要重复执行,您可以使用更高级别的并发 API 和执行器服务:

public static void main(String[] args) {

     Runnable r = new Runnable() {
         public void run() {
             runYourBackgroundTaskHere();
         }
     };

     ExecutorService executor = Executors.newCachedThreadPool();
     executor.submit(r);
     // this line will execute immediately, not waiting for your task to complete
     executor.shutDown(); // tell executor no more work is coming
     // this line will also execute without waiting for the task to finish
    }

【讨论】:

  • 谢谢你 assylias..!!我跑了出来,导致了这个非常基本的问题。但是你的代码帮助了我!谢谢!
  • 当我查看任务管理器后台进程时,系统没有显示.....这是怎么回事......请删除一行以提供帮助
  • @KarueBensonKarue 我发布的代码确实创建了一个新线程 - 如果您没有得到该结果,我建议您提出一个单独的问题。
  • @Karue,任务管理器显示进程,而不是线程。所有这些线程都将显示在拥有它们的单个 java 进程下。
  • 如果可以在 Java 答案中提及所需的 imports 会很酷,特别是如果所述答案甚至包括一个主要的并且应该是一段独立的代码,所以我不必寻找每次都为他们...
【解决方案2】:

使用 Lambda 更简单! (Java 8) 是的,这确实有效,我很惊讶没有人提到它。

new Thread(() -> {
    //run background code here
}).start();

【讨论】:

    【解决方案3】:

    这是使用匿名内部类创建线程的另一种方式。

        public class AnonThread {
            public static void main(String[] args) {
                System.out.println("Main thread");
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                    System.out.println("Inner Thread");
                    }
                }).start();
            }
        }
    

    【讨论】:

      【解决方案4】:

      如果你喜欢用 Java 8 的方式来做,你可以像这样简单:

      public class Java8Thread {
      
          public static void main(String[] args) {
              System.out.println("Main thread");
              new Thread(this::myBackgroundTask).start();
          }
      
          private void myBackgroundTask() {
              System.out.println("Inner Thread");
          }
      }
      

      【讨论】:

      • 这对产生线程有什么帮助?它甚至不会编译。 1. 新线程(this::myBackgroundTask).start();传递返回void的方法ref? 2. new Thread(this::myBackgroundTask).start(); thismain(静态)方法中? Java 8 的方式应该是:方法调用: new Thread(new Java8Thread().myBackgroundTask()).start(); 方法定义: private Runnable myBackgroundTask() { return ()->{ //background task }; }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      相关资源
      最近更新 更多