Threading в Java - PullRequest
       1

Threading в Java

2 голосов
/ 26 июня 2010

Я создал один дочерний поток, и теперь я хочу отправить сообщение из дочернего потока в основной поток.как я могу это сделать?

Ответы [ 5 ]

7 голосов
/ 26 июня 2010

В созданной вами теме вам понадобится ссылка на поток, в который вы пытаетесь отправить сообщение (вызов метода).

IE

MainClass.java:

public class MainClass implements Runnable
{
    private Queue<String> internalQueue;
    private boolean keepRunning;

    public MainClass()
    {
        keepRunning = true;
        internalQueue = new Queue<String>();
    }

    public void queue(String s)
    {
        internalQueue.add(s);
        this.notify();
    }

    public void run()
    {
         // main thread

         // create child thread
         Runnable r = new YourThread(this);
         new Thread().start(r);

         // process your queue
         while (keepRunning) {
             // check if there is something on your queue
             // sleep
             this.wait();
         }
    }

    public static void main(String[] args)
    {
       MainClass mc = new MainClass();
       mc.run();
    }
}

YourThread.java

public class YourThread implements Runnable
{
    private MainClass main;

    public YourThread(MainClass c)
    {
         this.main = c;
    }

    public void run()
    {
         // your thread starts here
         System.out.println("Queue a message to main thread");
         main.queue("Hi from child!");
    }
}
4 голосов
/ 04 февраля 2013

Использовать Callable интерфейс вместо Runnable

1 голос
/ 25 сентября 2012

Между потоками нет родительско-дочерних отношений.

Поток может порождать другой поток, и после его создания 2 потока не зависят друг от друга.

Пожалуйста, дайте нам знать, что вы подразумеваете под отправить сообщение .Это может охватывать широкий спектр вариантов использования, и каждый имеет свои лучшие реализации.

Например, если вы хотите синхронизировать 2 потока, вы можете использовать простой механизм ожидания / уведомления.Для этого вам придется разделить объект между 2.

Если вы хотите вычислить значение в порожденном потоке и передать его обратно, тогда вы можете использовать очереди.Но вам также придется рассказать нам больше о том, как связано выполнение двух потоков, чтобы мы могли предложить подходящий способ его реализации.(Например, механизм производитель-потребитель)

0 голосов
/ 30 августа 2013
public class MyClass {
    private MyInterface delegate;

    public void setDelegate(MyInterface delegate) {
        this.delegate = delegate;
    }

    // this will be performed in a background thread
    public void doStuff() {

        Future<String> future = Executors.newSingleThreadExecutor().submit(new Callable<String>() {

            @Override
            public String call() throws Exception {
                return "hello world";
            }
        });

        delegate.handleResponse(future.get());
    }
}

public interface MyInterface {
    void handleResponse(String value);
}

public class MainClass implements MyInterface {

    public static void main(String[] args) {
        MyClass myClass = new MyClass();

        myClass.setDelegate(this);
        myClass.doStuff();
    }

    @Override
    public void handleResponse(String value) {

        // this will be on the main thread
        System.out.println(value);
    }
}
0 голосов
/ 27 июня 2010

Используется приоритетная очередь в качестве объекта, с которым взаимодействуют родительский (основной поток) и дочерний поток. Определение дочернего работоспособного объекта

class CommunicationThead implements Runnable{
    Queue<String> commQueue=null; 
    CommunicationThead(Queue<String> q){
        super();
        this.commQueue=q;
    }
    public void run(){
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            System.out.println("child :interuppted on sleep");
        }
        synchronized(commQueue){
            if(commQueue!=null)
            {
                commQueue.add("Yo");
                System.out.println("message added by child");
            }
            commQueue.notifyAll();
        }
    }
}

Вызов дочернего исполняемого объекта (вызывается в main ()) основной поток ожидает, пока не получит сообщение от дочернего объекта.нить

Queue<String> q=new PriorityQueue<String>();
Thread child=new Thread(new CommunicationThead(q));
child.start();
boolean msgReceived=true;
while(msgReceived){
    synchronized(q){
        if(q.isEmpty())
        {
            try {
                System.out.println("parent: queue empty | parent waiting");
                q.wait(1000);
            } catch (InterruptedException e) {
                System.out.println("parent wait interrupted");
            }
        }
        else{
            System.out.println("parent found message :"+q.poll());
            msgReceived=false;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...