【问题标题】:How do I call a method from a Thread on the Main Thread?如何从主线程上的线程调用方法?
【发布时间】:2014-09-25 19:44:11
【问题描述】:

我有一个正在运行的线程,它连接到 Web 服务器,代码位于不同的线程上,因为我不希望程序在每次调用代码时都停止。

在线程中,我需要调用一个方法,但我需要从主线程调用它,不知道有没有办法做到这一点。

如果我不是很清楚(我很确定我不是 xD),那么这里有一些伪代码:

thread.start(){
    <do webcall stuff>
    <call method from main thread>
}

【问题讨论】:

  • 您在对象上调用方法,而不是在线程上。如果您需要从另一个线程中调用某些东西,事情就会变得棘手。你的问题的背景信息是什么,背景是什么?如果绝对需要此功能,我想您可以创建某种事件队列,可能是接受 Runnables 或 Callables 的事件队列,然后从所需线程遍历队列。

标签: java multithreading


【解决方案1】:

使用诸如布尔值之类的概念,然后让您的主线程“观察变化”:

“这样做的好方法是让线程的 run() 由布尔变量保护,并在你想停止它时从外部将其设置为 true,例如:” - JACK

How to stop a java thread gracefully?

【讨论】:

  • 使用中断(并定期检查)优于滚动自己。
  • @user949300 我有 1 个疑问。您如何从子线程中断()主线程。我应该将线程对象引用传递给我的子线程还是有更好的方法?跨度>
【解决方案2】:

可能的代码如下:

确保你

  • 使用“volatile”在线程间运行时不会产生不良副作用
  • 使用 ConcurentLinkedQueue,您可以在其中添加在并行线程中处理的任务

 public class Program {

    volatile static ConcurrentLinkedQueue<MyData> _items = new ConcurrentLinkedQueue<MyData>();

    public static void main(String[] args) throws InterruptedException {
        Thread thr = new Thread(()->{

        System.out.println("Web service called");
        _items.add(new MyData()); });

        boolean exit = false;

        while(!exit) {

          while (!_items.isEmpty()) {

            MyData item = _items.poll();

           //do something with your data
        }
        Thread.sleep(200);
    }
}

【讨论】:

    【解决方案3】:

    如果你说你想调用这个新线程产生的方法。然后将该实例传递给您要调用该方法的对象的新 Runnable 实现。没有办法让主线程调用特定的方法。

    您可以从该线程生成新线程并调用您需要的方法。

    【讨论】:

    • 哦,你可以。线程可以使用 wait() 和 notify() 或通过调用中断来相互交互
    • 但是你被一个线程阻塞了,这是不可取的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多