2017-05-31 44 views
1

在Android中,我们有处理程序#后(可运行)方法从另一个发布一个Runnable在普通的Java另一个线程

张贴一些代码,主线程有可能使同样的事情在普通的Java(例如而使用挥杆)?

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

此外还有一个可选的问题(你可能不会回答): 如果可能的话,有人会向我解释Handler究竟是如何做Android的。它如何能够将一些代码发布到MainThread? Looper的目的是什么?

+1

请张贴你想要做的更具体的例子。 –

+0

GV,不,我不做Android编程,但是我做了很多Swing编码,包括使用后台线程。 –

+0

@HovercraftFullOfEels你使用Android吗?有一个类Handler。用法很简单:新的Hanldler(Looper.getMainLooper())。post(new Runnable(){void run(){}});不管什么线程现在是最新的,run()方法只会在MainThread中调用。 –

回答

2

解决您的其他问题:

你说“在Android中,我们有处理程序#后(可运行)方法从另一个张贴一些代码,主线程”

这是不完全正确。如果线程B被初始化为Looper,并且线程A对目标线程B具有对Handler的引用,您可以从任何线程A向任何线程B发布一些代码。

当您需要在UI线程上做一些事情,因为UI线程已经有Looper,你可以从几乎任何地方检索它。静态方法Looper.getMainLooper是为主线程获取Looper的一种方法。如果使用此Looper初始化Handler,则可以发布Runnable或发送Message(但如果发布Runnable,它也会被包装为Message),并且它将在UI线程上执行。

Looper,作为名称提示,基本上运行一个线程的非终止循环。 Looper有一个关联的MessageQueue它不断地检查新的Messages.通过Handler初始化与Looper你可以排队Messages在这个线程。 Messages按顺序处理,具体取决于Messagewhen字段。

这是一个基本的实现弯针线的:

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(); 
     } 
    } 

我建议你阅读每棵G.B.的第5章Android Concurrency。它会让你对Looper/Handler框架有一个全面的了解。在阅读时浏览源代码也很棒,它非常简单且不言自明。

+0

我最近发布了一个类似问题的答案,我更详细地解释了发布消息的内幕:https://stackoverflow.com/a/44478689/2611340 –

0

范围内摆动,你会用

https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingUtilities.html#invokeLater-java.lang.Runnable- 

运行在主线程上的东西。

在一般的Java,一个ExecutorService就像是一个线程池,并允许您提交Runnable或赎回情况

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

然而,如果你不使用的ExecutorService或摇摆,没有标准的Java API告诉另一个线程做些事情。