在纯java中向另一个线程发布Runnable
在Android中,我们有Handler#post(Runnable)方法将一些代码从另一个线程发布到主线程 是否可以在普通java中实现相同的功能(例如,在使用swing时) 解释问题: 假设我们有两个线程:ThreadA和ThreadB。两者都已启动并并排运行。ThreadB希望ThreadA调用某个方法(同样,ThreadA已经在运行) 添加可选问题(您可能无法回答):在纯java中向另一个线程发布Runnable,java,multithreading,Java,Multithreading,在Android中,我们有Handler#post(Runnable)方法将一些代码从另一个线程发布到主线程 是否可以在普通java中实现相同的功能(例如,在使用swing时) 解释问题: 假设我们有两个线程:ThreadA和ThreadB。两者都已启动并并排运行。ThreadB希望ThreadA调用某个方法(同样,ThreadA已经在运行) 添加可选问题(您可能无法回答): 如果可能的话,请有人向我解释一下Handler在Android中的具体功能。它如何能够将一些代码发布到主线程?活套的用途
如果可能的话,请有人向我解释一下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
放在队列上,当它“弹出”时,“主线程”会处理该队列aRunnable
退出队列,它只调用Run
方法。我最近发布了一个类似问题的答案,其中我更详细地解释了发布消息的内部结构: