java中的线程间通信
在Java中如何互相依赖的线程进行通信?
例如,我正在构build一个需要来自其他线程数据的线程的Web爬虫。
这取决于沟通的性质。
- 它是双面的(即A和B和B谈话对A)?
- 数据的通信或者完成的通信?
- 等等。
线程间通信的最简单和最可取的forms就是等待其他线程的完成。 这很容易通过使用Future
:
ExecutorService exec = Executors.newFixedThreadPool(50); final Future f = exec.submit(task1); exec.submit(new Runnable() { @Override public void run() { f.get(); // do stuff } });
第二个任务将不会执行,直到第一个完成。
Java 5+有许多处理这种事情的并发实用程序。 这可能意味着使用LinkedBlockingQueue
, CountDownLatch
或许多其他许多。
有关并发性的深入检查Java实践中的并发是一个必读。
以下是线程间通信的示例:
public class Main { public static void main(String[] args) { Chat m = new Chat(); new T1(m); new T2(m); } } class Chat { boolean flag = false; public synchronized void FromSam(String msg) { if (flag) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(msg); flag = true; notify(); } public synchronized void FromJam(String msg) { if (!flag) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(msg); flag = false; notify(); } } class T1 implements Runnable { Chat m; String[] s1 = { "Hello Jam", "How are you ?", "I am also doing fine!" }; public T1(Chat m1) { this.m = m1; new Thread(this, "Sam").start(); } public void run() { for (int i = 0; i < s1.length; i++) { m.FromSam(s1[i]); } } } class T2 implements Runnable { Chat m; String[] s2 = { "HI Sam", "I am good,And U ?", "ha haa" }; public T2(Chat m2) { this.m = m2; new Thread(this, "Jam").start(); } public void run() { for (int i = 0; i < s2.length; i++) { m.FromJam(s2[i]); } } }
看看java.util.Observer /java.util.Observable。 他们正是你正在寻找的。
您可以使用2个ExecutorServices,将一个Callable实现提交给服务A,该服务知道关于服务B的后续事情。当Callable完成它的工作时,它将向服务B提交一个新的任务,用于执行额外的结果。
您可以使用CountDownLatch或其他一些障碍,如果在两个服务中都处理完所有项目后需要执行额外的工作。
ExecutorService API是非常简单的,大多数情况下你可能会使用类似.newFixedThreadPool(int threads)和提交Runnables / Callables它。