Java线程同步:线程A等待线程B结果的实现

需积分: 3 1 下载量 190 浏览量 更新于2024-09-13 收藏 2KB TXT 举报
"Java 多线程异步通信示例" 在Java编程中,多线程是并发执行任务的关键机制。当线程A需要依赖线程B的结果才能继续执行时,就需要实现线程间的异步通信。这个过程通常涉及到同步锁、等待(wait)和通知(notify/notifyAll)机制。以下将详细解释这些概念及其在给定代码中的应用。 首先,Java中使用`synchronized`关键字来实现线程同步,保证同一时间只有一个线程可以访问特定的代码块或方法,防止数据竞争问题。在给定的代码中,`synObject`是一个共享对象,`synchronized`块确保了对它的操作是线程安全的。 线程A(ThreadA)在其`run`方法中首先获取到`synObject`的锁,然后打印出"߳Aȴ֪ͨ"。接着,它调用`synObject.wait()`,使当前线程A进入等待状态并释放锁,等待其他线程唤醒。`wait()`方法会抛出`InterruptedException`,因此需要捕获处理。这里设置了一个超时时间(1000*30毫秒),表示如果在30秒内没有被唤醒,线程A会自动结束等待。 线程B(ThreadB)同样获取到`synObject`的锁,然后打印出"Б߳̿ʼ..",模拟线程B执行其任务,这里通过`sleep(5000)`模拟延迟。任务完成后,线程B打印出"B߽߳",表明线程B的任务执行完毕。接下来,线程B调用`synObject.notify()`,这会唤醒一个正在`synObject`上等待的线程,如果没有等待的线程,这个调用会被忽略。最后,线程B打印出"֪ͨ",表示通知已完成。 在主程序中,创建了线程A和线程B,并启动它们。线程B先执行,因为没有竞争,所以可以立即获取到锁并执行其任务。当线程B执行完后,唤醒线程A,线程A结束等待并继续执行,打印出"׼֪ͨȴʱ",表明线程A接收到线程B的通知并继续运行。 `notify`和`notifyAll`的区别在于,`notify`只会唤醒一个等待的线程,而`notifyAll`会唤醒所有等待的线程。在上述代码中,由于只有一个线程在等待,`notify`和`notifyAll`的效果是一样的。 Java的线程异步通信是通过同步锁、等待和通知机制实现的,确保了线程间的数据交换和协作。在实际编程中,熟练掌握这些机制对于编写高效的多线程程序至关重要。