Java多线程通信问题详解

原创 曾经终败给现在 2024-10-13 02:21 129阅读 0赞

在Java编程中,多线程通信是一个关键主题。它涉及到不同线程之间的信息交换。下面详细讲解几个主要的通信方式:

  1. 共享变量

    • 通过synchronized关键字保护的变量可以被多个线程共享。
    • 示例代码:

      1. // 同步锁
      2. private Object lock = new Object();
      3. public void thread1() {
      4. synchronized (lock) { // 确保互斥访问
      5. System.out.println("Thread 1: Before acquire");
      6. lock.notifyAll(); // 唤醒所有等待的线程
      7. System.out.println("Thread 1: After release");
      8. }
      9. // 其他操作...
      10. }
      11. public void thread2() {
      12. synchronized (lock) { // 同理,互斥访问
      13. System.out.println("Thread 2: Before acquire");
      14. lock.wait(); // 等待锁释放
      15. System.out.println("Thread 2: After release");
      16. }
      17. // 其他操作...
      18. }
  2. 信号量机制

    • Java内置的Semaphore类提供了信号量机制。
    • 示例代码:

      1. // 创建一个信号量,初始值为1(表示只有一个许可证)
      2. Semaphore semaphore = new Semaphore(1);
      3. public void thread1() {
      4. try {
      5. // 请求一个许可证
      6. semaphore.acquire();
      7. System.out.println("Thread 1: Acquired license");
      8. // 执行其他任务...
      9. // 释放许可证
      10. semaphore.release();
      11. System.out.println("Thread 1: Released license");
      12. } catch (InterruptedException e) {
      13. e.printStackTrace();
      14. }
      15. // 其他操作...
      16. }
      17. public void thread2() {
      18. try {
      19. // 请求一个许可证,如果已满则等待
      20. semaphore.acquire();
      21. System.out.println("Thread 2: Acquired license");
      22. // 执行其他任务...
      23. // 释放许可证,不需要特别调用方法,因为已经持有许可证
      24. semaphore.release();
      25. System.out.println("Thread 2: Released license");
      26. } catch (InterruptedException e) {
      27. e.printStackTrace();
      28. }
      29. // 其他操作...
      30. }
  3. wait/notify

    • 这是线程通信中最基础的方式。
    • 示例代码同上,但不使用信号量。

掌握以上几种多线程通信方式后,可以根据具体需求和场景选择合适的方法。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,129人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java 线-线通信

    最近,美美非常的爱吃栗子,剥栗子却有些麻烦,这个任务理所当然的交给了帅帅,每一次,帅帅都会把热气腾腾的栗子剥好,然后放进一个盘子里,而美美每次都会从盘子里拿一个栗子吃: !