面试高频知识点:2线程 2.1.6线程之间如何通信

线程之间的通信方式

在Java中,常见的线程之间通信方式包括:

  1. 共享内存:通过共享内存区域进行通信,即多个线程共享同一块内存区域。通常需要使用同步机制来保护共享数据的一致性。

  2. 消息传递:通过消息传递的方式进行通信,即线程之间通过发送和接收消息来进行信息交换。

下面将分别介绍这两种通信方式,并提供示例代码。

共享内存通信方式

共享内存通信方式是通过共享内存区域进行数据交换的方式。在Java中,可以使用共享对象(例如共享变量)来实现线程之间的通信。常见的共享内存通信方式包括:

  • 使用synchronized关键字对共享变量进行同步;
  • 使用volatile关键字保证共享变量的可见性;
  • 使用Lock和Condition等并发工具类进行线程同步。

下面是一个使用synchronized关键字实现的示例:

class SharedObject {
    private int sharedData;

    public synchronized void setSharedData(int data) {
        sharedData = data;
        notify(); // 通知等待中的线程
    }

    public synchronized int getSharedData() throws InterruptedException {
        while (sharedData == 0) {
            wait(); // 等待数据被设置
        }
        return sharedData;
    }
}

class Producer extends Thread {
    private SharedObject sharedObject;

    public Producer(SharedObject sharedObject) {
        this.sharedObject = sharedObject;
    }

    @Override
    public void run() {
        sharedObject.setSharedData(1);
    }
}

class Consumer extends Thread {
    private SharedObject sharedObject;

    public Consumer(SharedObject sharedObject) {
        this.sharedObject = sharedObject;
    }

    @Override
    public void run() {
        try {
            int data = sharedObject.getSharedData();
            System.out.println("Consumer received data: " + data);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class SharedMemoryCommunicationExample {
    public static void main(String[] args) {
        SharedObject sharedObject = new SharedObject();
        Producer producer = new Producer(sharedObject);
        Consumer consumer = new Consumer(sharedObject);

        producer.start();
        consumer.start();
    }
}

消息传递通信方式

消息传递通信方式是通过发送和接收消息来进行线程间的通信。在Java中,可以使用wait、notify和notifyAll方法实现线程之间的消息传递。也可以使用阻塞队列(如LinkedBlockingQueue)等并发容器来进行消息传递。

下面是一个使用wait和notify方法实现的示例:

class Message {
    private String content;

    public synchronized void setContent(String content) {
        this.content = content;
        notify(); // 通知等待中的线程
    }

    public synchronized String getContent() throws InterruptedException {
        while (content == null) {
            wait(); // 等待消息被设置
        }
        return content;
    }
}

class Sender extends Thread {
    private Message message;

    public Sender(Message message) {
        this.message = message;
    }

    @Override
    public void run() {
        message.setContent("Hello, Receiver!");
    }
}

class Receiver extends Thread {
    private Message message;

    public Receiver(Message message) {
        this.message = message;
    }

    @Override
    public void run() {
        try {
            String receivedContent = message.getContent();
            System.out.println("Receiver received message: " + receivedContent);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class MessagePassingCommunicationExample {
    public static void main(String[] args) {
        Message message = new Message();
        Sender sender = new Sender(message);
        Receiver receiver = new Receiver(message);

        sender.start();
        receiver.start();
    }
}

相关推荐

  1. 面试高频知识2线 2.1.6线之间如何通信

    2024-02-11 18:44:01       44 阅读
  2. 面试高频知识2线 2.1.4 线池常用参数

    2024-02-11 18:44:01       51 阅读
  3. 线之间如何通信

    2024-02-11 18:44:01       53 阅读
  4. 线知识

    2024-02-11 18:44:01       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-11 18:44:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-11 18:44:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-11 18:44:01       82 阅读
  4. Python语言-面向对象

    2024-02-11 18:44:01       91 阅读

热门阅读

  1. 力扣94-二叉树的中序遍历

    2024-02-11 18:44:01       57 阅读
  2. 2.3 Binance_interface APP 现货行情-实时行情

    2024-02-11 18:44:01       51 阅读
  3. 1.1 Binance_interface安装与介绍

    2024-02-11 18:44:01       54 阅读
  4. 数据结构入门(2)时间复杂度与空间复杂度

    2024-02-11 18:44:01       49 阅读
  5. Leetcode 121 买卖股票的最佳时机

    2024-02-11 18:44:01       59 阅读
  6. 94 . 二叉树的中序遍历 -- 2024.2.10 LeetCode每日一题

    2024-02-11 18:44:01       58 阅读
  7. 完全背包总结二

    2024-02-11 18:44:01       45 阅读
  8. Elasticsearch中的模板:定义、作用与实践

    2024-02-11 18:44:01       56 阅读
  9. 计算机网络(第六版)复习提纲29

    2024-02-11 18:44:01       45 阅读
  10. 2023年股市总结,2024年A股方向展望!

    2024-02-11 18:44:01       50 阅读