Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
在纯java中向另一个线程发布Runnable_Java_Multithreading - Fatal编程技术网

在纯java中向另一个线程发布Runnable

在纯java中向另一个线程发布Runnable,java,multithreading,Java,Multithreading,在Android中,我们有Handler#post(Runnable)方法将一些代码从另一个线程发布到主线程 是否可以在普通java中实现相同的功能(例如,在使用swing时) 解释问题: 假设我们有两个线程:ThreadA和ThreadB。两者都已启动并并排运行。ThreadB希望ThreadA调用某个方法(同样,ThreadA已经在运行) 添加可选问题(您可能无法回答): 如果可能的话,请有人向我解释一下Handler在Android中的具体功能。它如何能够将一些代码发布到主线程?活套的用途

在Android中,我们有Handler#post(Runnable)方法将一些代码从另一个线程发布到主线程

是否可以在普通java中实现相同的功能(例如,在使用swing时)

解释问题: 假设我们有两个线程:ThreadA和ThreadB。两者都已启动并并排运行。ThreadB希望ThreadA调用某个方法(同样,ThreadA已经在运行)

添加可选问题(您可能无法回答):
如果可能的话,请有人向我解释一下Handler在Android中的具体功能。它如何能够将一些代码发布到主线程?活套的用途是什么?

在Swing中,您将使用

https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingUtilities.html#invokeLater-java.lang.Runnable-
在主线程上运行某些内容

在一般Java中,ExecutorService类似于线程池,允许您提交可运行或可调用的实例

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html

但是,如果您没有使用ExecutorService或Swing,则没有标准Java API来告诉另一个线程执行某些操作。

解决您的其他问题:

您说过“在Android中,我们有Handler#post(Runnable)方法将一些代码从另一个线程发布到主线程”

这并不完全正确。如果线程B被初始化为
活套
,并且线程A对目标线程B的
处理程序
有引用,则可以从任何线程A向任何线程B“发布一些代码”

当您需要在UI线程上执行某些操作时,它非常方便,因为UI线程已经有一个
循环器
,您几乎可以从任何地方检索它。静态方法
Looper.getMainLooper
是为主线程获取
Looper
的一种方法。如果使用此
活套
初始化
处理程序
,则可以发布
可运行
或向其发送
消息
(但如果发布
可运行
,它也会被包装为
消息
),并将在UI线程上执行

Looper
,顾名思义,基本上是为线程运行一个非终止循环。
循环器
有一个关联的
消息队列
,它会不断检查新的
消息。
通过
处理程序
使用
循环器
初始化,您可以在此线程上将
消息
排队。根据
消息
when
字段,按顺序处理
消息

以下是活套线程的基本实现:

  class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };

          Looper.loop();
      }
  }

我建议您阅读Meike G.B.Android并发的第5章。它将使您全面了解Looper/Handler框架。阅读时浏览源代码也很好,它相当简单且不言自明。

请发布一个更具体的示例,说明您正在尝试做什么。GV,不,我不做Android编程,但我做了很多Swing编码,包括使用后台线程。@HovercraftFullOfEels您使用Android吗?有一个类处理程序。用法很简单:new Hanldler(Looper.getMainLooper()).post(new Runnable(){void run(){});不管现在哪个线程是当前线程,run()方法只会在MainThread中调用。对于处理程序ThreadLocal、thread、Looper,由处理程序跟随,研究这三个概念以及thread.java如何使用映射结构来关联thread local对象设置的值。如果你深入研究以上主题,你会有很好的学习经验。这些包括处理程序内部工作的概念。在1级以上学习期间。为什么不能在没有循环器对象的线程中创建处理程序对象2。looper对象如何与当前线程3关联。Looper.prepare()做什么和如何做,最后是关于Looper.loop()方法“Handler在Android中到底是如何做的”-在不知道API如何工作的具体情况下,我建议
Handler#post
Runnable
放在队列上,当它“弹出”时,“主线程”会处理该队列a
Runnable
退出队列,它只调用
Run
方法。我最近发布了一个类似问题的答案,其中我更详细地解释了发布消息的内部结构: