gpt4 book ai didi

java - 将 Runnable 发布到纯 Java 中的另一个线程

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:03:35 24 4
gpt4 key购买 nike

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

是否有可能在纯 java 中做同样的事情(例如在使用 swing 时)?

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

附加自选题(可以不答):如果可能的话,请有人向我解释 Handler 在 Android 中究竟是如何做的。它如何能够将一些代码发布到 MainThread? Looper 的用途是什么?

最佳答案

解决您的附加问题:

你说“在 Android 中我们有 Handler#post(Runnable) 方法来将一些代码从另一个发送到主线程

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

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

Looper,顾名思义,基本上是为线程运行一个非终止循环。 Looper 有一个关联的 MessageQueue,它不断地检查新的 Messages。通过 Handler 初始化>Looper 您可以在此线程上排队 MessagesMessages 按顺序处理,具体取决于 Messagewhen 字段。

这是 Looper 线程的基本实现:

  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.的第5章。安卓并发。它将让您全面了解 Looper/Handler 框架。在阅读时浏览源代码也很棒,它相当简单且不言自明。

关于java - 将 Runnable 发布到纯 Java 中的另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44295406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com