在我的应用程序中,当用户登录时,我有这个逻辑,它将使用用户拥有的所有符号调用下面的方法。
public void sendSymbol(String commaDelimitedSymbols) {
try {
// further logic
} catch (Throwable t) {
}
}
我的问题是,由于这个发送符号的任务可以缓慢完成但必须完成,所以无论如何我可以将其作为后台任务吗?
这可能吗?
请分享您的观点。
答案 0 :(得分:6)
这样的东西就是你要找的东西。
ExecutorService service = Executors.newFixedThreadPool(4);
service.submit(new Runnable() {
public void run() {
sendSymbol();
}
});
创建执行程序服务。这将保留一个线程池以供重用。比每次异步方法调用每次创建新线程更有效。
如果您需要对ExecutorService进行更高程度的控制,请使用ThreadPoolExecutor。至于配置此服务,它将取决于您的用例。你多久调用一次这种方法?如果经常,您可能希望至少在池中保留一个线程。我最多不会超过4或8。
由于你每半秒只调用sendSymbol
一次,因为sendSymbols
不是一个非常耗时的例程,所以一个线程应该足够多。我会配置一个固定的线程池与1个线程。您甚至可以重用此线程池来提交其他异步任务。
只要你提交的内容太多,当你致电sendSymbol
时就会有回应。
答案 1 :(得分:1)
没有真正简单的解决方案。基本上你需要另一个运行该方法的线程,但你还需要关心同步和线程安全。
new Thread(new Runnable() {
public void run() {
sendSymbol(String commaDelimitedSymbols);
}
}).start();
也许更好的方法是使用Executors
但是你需要了解线程安全性。这不是一项简单的任务。
答案 2 :(得分: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。谷歌那个,先生。
希望有效。
答案 3 :(得分:0)
当然,只需使用Java Threads,然后加入即可获得结果(或其他正确的同步方法,取决于您的要求)
答案 4 :(得分:0)
您需要生成一个单独的线程来同时执行此活动。虽然这不是一个单独的过程,但您可以在完成发送符号时继续执行其他任务。
答案 5 :(得分:0)
以下是如何使用线程的示例。您只需将Runnable子类化,其中包含您的数据以及要在线程中运行的代码。然后创建一个以该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();
}
}