【问题标题】:How to make calling a Method as a background process in java如何在java中将方法调用为后台进程
【发布时间】:2013-08-07 22:58:03
【问题描述】:

在我的应用程序中,当用户登录时,我有这个逻辑,它会调用下面的方法,以及用户拥有的所有符号。

public void sendSymbol(String commaDelimitedSymbols) {
        try {
            // further logic
        } catch (Throwable t) {

        }
    }

我的问题是,由于发送符号的任务可以缓慢完成但必须完成,所以无论如何我可以将其作为后台任务吗??

这可能吗??

请分享您的观点。

【问题讨论】:

  • 您想启动一个新线程来运行该方法。从Thread javadoc 开始并搜索一些线程教程。
  • 你试过在另一个线程中做吗?

标签: java multithreading parallel-processing


【解决方案1】:

您正在寻找这样的东西。

    ExecutorService service = Executors.newFixedThreadPool(4);
    service.submit(new Runnable() {
        public void run() {
            sendSymbol();
        }
    });

创建一个执行器服务。这将保留一个线程池以供重用。比每次为每个异步方法调用创建一个新线程要高效得多。

如果您需要对 ExecutorService 进行更高程度的控制,请使用 ThreadPoolExecutor。至于配置此服务,这将取决于您的用例。您多久调用一次此方法?如果经常,您可能希望至少始终在池中保留一个线程。我最多不会保留超过 4 或 8 个。

由于您每半秒只调用一次sendSymbol,一个线程应该足够了,因为sendSymbols 不是一个非常耗时的例程。我会配置一个带有 1 个线程的固定线程池。您甚至可以重用这个线程池来提交其他异步任务。

只要不提交太多,调用sendSymbol就会有响应。

【讨论】:

  • 这是我一直在寻找的东西,但是在你的情况下应该如何决定 4 号??
  • 我进行了编辑以包含一些相关信息。这将取决于您的用例。您是否经常调用发送符号?如果 2 次发送符号的调用乱序执行,是否可以接受?其中一部分需要您进行一些微调,但这两个问题可以帮助我更多地帮助您。
  • 这个发送符号每 0.5 秒被调用一次,如果 2 次发送符号的调用出现故障,您到底是什么意思??
  • 如果您有超过 1 个线程处理提交,那么您提交给 sendSymbols 的第二个调用可能会在第一个调用之前执行,因为超过 1 个线程正在处理 @987654327 中提交的可运行对象队列@。根据您提供的信息,我将再次进行编辑。
  • 我明白你的意思,如果两个 cals 的发送符号符号乱序是可以接受的。
【解决方案2】:

确实有可能。线程是要走的路。在 Java 中,您可以像这样启动一个新线程

Runnable backGroundRunnable = new Runnable() {
    public void run(){
         //Do something. Like call your function.
    }};
Thread sampleThread = new Thread(backGroundRunnable);
sampleThread.start();

当您调用 start() 时,它会启动一个新线程。该线程将开始运行 run() 函数。当 run() 完成时,线程终止。 请注意,如果您从 Swing 应用程序调用,则需要使用 SwingUtil。长官,谷歌一下。

希望有效。

【讨论】:

    【解决方案3】:

    没有真正简单的解决方案。基本上你需要另一个线程来运行该方法,但你还必须关心同步和线程安全。

    new Thread(new Runnable() {
    
    public void run() {
         sendSymbol(String commaDelimitedSymbols);
        }
    }).start();
    

    也许更好的方法是使用Executors

    但是您需要考虑线程安全性。这真的不是一个简单的任务。

    【讨论】:

      【解决方案4】:

      以下是如何使用线程的示例。您只需将 Runnable 子类化,其中包含您的数据和要在线程中运行的代码。然后创建一个以该可运行对象作为参数的线程。在线程上调用 start 将运行 Runnable 对象的 run 方法。

      public class MyRunnable implements Runnable {
      
          private String commaDelimitedSymbols;
      
          public MyRunnable(StringcommaDelimitedSymbols) {
              this.commaDelimitedSymbols = commaDelimitedSymbols;
          }
      
          public void run() {
              // Your code
          }
      }
      
      public class Program {
          public static void main(String args[]) {
              MyRunnable myRunnable = new MyRunnable("...");
              Thread t = new Thread(myRunnable)
              t.start();
          }    
      }
      

      【讨论】:

        【解决方案5】:

        您需要生成一个单独的线程来同时执行此活动。虽然这不是一个单独的过程,但您可以在完成发送符号的同时继续执行其他任务。

        【讨论】:

          【解决方案6】:

          当然,只需使用Java Threads,并加入它以获取结果(或其他适当的同步方法,取决于您的要求)

          【讨论】:

            猜你喜欢
            • 2014-07-07
            • 2012-06-25
            • 1970-01-01
            • 2020-07-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多