Create 2 threads and communicate between them
I want to make a background task in one thread and send information from that thread to another thread which runs the main program and update the information each period of time.
Thread1:
public void doTask()
{
// ...
someData = ...;
}
Thread2:
SwingUt开发者_如何学Cilities.invokeLater(new Runnable()
{
public void run()
{
new MainFrame(someData);
}
});
How could I achieve this in java?
Use the Java Concurrency API. Usage of BlockingQueue
s, Future<>
will help you.
Note: This is a classic producer-consumer problem. This can be achieved having a shared queue to hold data where one thread will push data into the queue and the othe will consume the data. Proper synchronisation is needed to achieve a correct solution. BlockingQueue
implementations like LinkedBlockingQueue
will be helpful.
Update: Part of you problem [the consumer] can be derived from this answer of mine. But this solution uses the simpler wait
-notify
approach.
I using Executor/ExecutorService, output from these methods starting java.swing.Action (create a new EDT if doesn't exists),
or you can test that For EDT
if (SwingUtilities.isEventDispatchThread()) {...
both ways for your Wratever sould be always in EDT, I vote for wraps output to the GUI into Action
Java doesn't have a direct mechanism for a specific thread to send a message to another SPECIFIC thread.
But there are indirect ways of achieving this though. For example, you can define a message queue object on one thread and then pass a reference to that queue to the second thread. The second thread can insert message objects into this queue; and the first thread can keep polling the queue to get itself alerted to new messages.
Also answered in this thread
Communicating between two threads
The above link has some sample (pseudo) code.
This is maybe an overengineered aproach for this case, but nonetheless you could use EventBus - each Thread could publish and be subsrcibed to events.
An example is here.
精彩评论