1

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

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

        }
    }

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

这可能吗 ??

请分享您的意见。

4

6 回答 6

8

像这样的东西就是你要找的东西。

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

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

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

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

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

于 2013-08-06T19:29:15.523 回答
1

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

new Thread(new Runnable() {

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

也许更好的方法是使用Executors

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

于 2013-08-06T19:20:42.503 回答
1

这当然是可能的。线程是要走的路。在 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。谷歌一下,先生。

希望有效。

于 2013-08-06T19:21:11.663 回答
0

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

于 2013-08-06T19:16:36.503 回答
0

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

于 2013-08-06T19:17:27.490 回答
0

以下是如何使用线程的示例。您只需将 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();
    }    
}
于 2013-08-06T19:18:03.613 回答