Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将AsyncTask从Android移植到java?_Java_Android_Multithreading - Fatal编程技术网

如何将AsyncTask从Android移植到java?

如何将AsyncTask从Android移植到java?,java,android,multithreading,Java,Android,Multithreading,在Android中,在UI线程和其他线程之间进行同步非常有用。所以我阅读了它,并尝试移植到JavaClassic(JDK),但没有成功,因为java中不存在某些类(Message,Handler…) 我想用一些有用的函数创建一个类,比如AsyncTask(可以在主线程和其他线程之间同步): 有什么办法可以尝试吗?1.异步任务是专门为android开发的,用于同步UI线程和非UI线程,也称为无痛线程 2.Java中有一种AsyncTask的替代方法,名为SwingWorker 请参阅此链接,以获得

在Android中,在UI线程和其他线程之间进行同步非常有用。所以我阅读了它,并尝试移植到JavaClassic(JDK),但没有成功,因为java中不存在某些类(Message,Handler…)
我想用一些有用的函数创建一个类,比如AsyncTask(可以在主线程和其他线程之间同步):


有什么办法可以尝试吗?

1.
异步任务
是专门为android开发的,用于同步UI线程和非UI线程,也称为无痛线程

2.Java中有一种AsyncTask的替代方法,名为
SwingWorker

请参阅此链接,以获得一个不错的基础教程:


同意
SwingWorker
异步任务的最直接模拟

如果不使用Swing,另一个选项是
ThreadPoolExecutor

这里有一篇文章演示如何使用
ThreadPoolExecutor
生成多个后台线程:

生成一个运行和完成而无需进度更新的后台线程(这也是Android中
AsyncTask
的常见用法)可以非常简单:

Executors.newSingleThreadExecutor().execute(new Runnable() {
  @Override
  public void run() {
    // do stuff in background
  }
});

对于类似的情况,我使用了观察者设计模式。生成背景线程后,主线程进入睡眠模式。当后台线程完成异步任务时,它会用回调消息唤醒主线程。这实际上删除了正在等待回调的同步对象上的块

您看过了吗,它们或多或少相当于JDK中的AsyncTask。+1。如果您使用Swing来构建UI,SwingWorker可能是一个不错的选择。这个类只适用于SwingUI吗?我尝试将此类用于控制台(用于测试)应用程序,但它从未调用doInBackground()方法(尽管我使用了excute()方法)。因为我想在主线程(不仅仅是UI线程)和其他的Android线程线程之间进行同步。然后,Android应用程序在专用的UI线程上启动,将其视为主线程。而在Java GUI中,JVM启动一个主线程,并将Main()方法放在该主线程堆栈的底部。由于JAVA GUI中的main()不是长期存在的,所以事件调度程序线程会处理它。。。这就是我们建议将非UI工作从EDT线程中移除的原因。现在SwingWorker处理EDT(UI线程)和非UI线程之间的同步。如何返回到原始线程?类似于
AsyncTask
onPostExecute
。使用这样的执行器只能根据执行器实现的某些策略解决在后台线程中运行代码的问题。将工作分派回UI线程(或任何其他线程)仍然需要解决。Android通过处理程序在目标线程的循环器中发送消息/可运行文件来解决这个问题。@ademar111190这实际上取决于您的特定用例。AsyncTask的
onPostExecute
是通过向队列发送消息来实现的,然后UI线程在收到消息时执行代码
SwingWorker
有一个类似的方法
done()
内部调用
get()
以获得
doInBackground
的结果。对于更一般的线程间通信来说,这是一个很好的起点,根据上下文的不同,您还可以访问某种更高级别的API。
Executors.newSingleThreadExecutor().execute(new Runnable() {
  @Override
  public void run() {
    // do stuff in background
  }
});