2014-09-25 96 views
-1

我有一个正在运行的线程,它连接到一个web服务器,代码位于另一个线程上,因为我不希望程序每次调用代码时都停止。如何从主线程上的线程调用方法?

虽然在线程中,我需要调用一个方法,但我需要从主线程调用它,不知道是否有任何方法可以做到这一点。

如果我不是很清楚(我敢肯定我是不是XD),然后这里是一些伪代码:

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

您在对象上调用方法,而不是在线程上调用方法。如果你需要从另一个线程中调用某些东西,事情会变得棘手。什么是你的问题的背景资料,背景?如果这个功能是绝对需要的,我想你可以创建一个某种类型的事件队列,可能是接受Runnables或Callables的事件队列,然后从所需的线程遍历队列。 – 2014-09-25 19:46:48

回答

0

使用的概念,如布尔值,然后让你的主线程“注意变化”:

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

How to stop a java thread gracefully?

+3

使用中断(并定期检查它)比自己滚动更受欢迎。 – user949300 2014-09-25 19:49:10

+1

@ user949300我有1个疑问。你如何中断()一个主线程从一个子线程。我应该将线程的对象引用传递给我的子线程还是有更好的方法? – 2014-09-25 19:59:07

-1

如果你说你想调用一个方法从这个新线程产生出来。然后将该实例传递给要在其上调用方法的对象的新Runnable实现。没有办法,你可以直接主线程应该调用特定的方法。

你可以产生新的线程,并从该线程调用你需要的方法。

+0

哦,你可以.Threads可以使用wait()和notify()或通过调用中断来相互交互 – 2014-09-25 20:03:33

+0

但是然后你被阻塞在一个不希望的线程。 – 2014-09-25 20:12:47

0

可能的代码可以是以下几点:

确保您

  • 使用“挥发性”不要有不良副作用线程之间运行
  • 使用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); 
    } 
} 
相关问题