• 面试题-多线程-Java 如何实现多线程之间的通讯和协作


    在Java中,有多种方法可以实现多线程之间的通信和协作,以下是几种常见的方式:

    1. 使用Object的wait(), notify() 和 notifyAll() 方法:这些方法用于协调多个线程对共享资源的访问。在一个线程调用对象的wait()方法时,它会释放对象的锁,让其他线程可以获取该对象的锁并访问共享资源。当其他线程调用该对象的notify()或notifyAll()方法时,正在等待的线程会被唤醒。需要注意的是,这些方法必须在同步块或者同步方法中被调用,否则会抛出IllegalMonitorStateException。
       
    1. public class SharedObject {
    2. private String message;
    3. public synchronized void write(String message) {
    4. while (this.message != null) {
    5. try {
    6. wait();
    7. } catch (InterruptedException e) {
    8. Thread.currentThread().interrupt();
    9. }
    10. }
    11. this.message = message;
    12. notifyAll();
    13. }
    14. public synchronized String read() {
    15. while (this.message == null) {
    16. try {
    17. wait();
    18. } catch (InterruptedException e) {
    19. Thread.currentThread().interrupt();
    20. }
    21. }
    22. String message = this.message;
    23. this.message = null;
    24. notifyAll();
    25. return message;
    26. }
    27. }
    28. public class WriterThread extends Thread {
    29. private SharedObject sharedObject;
    30. private String message;
    31. public WriterThread(SharedObject sharedObject, String message) {
    32. this.sharedObject = sharedObject;
    33. this.message = message;
    34. }
    35. @Override
    36. public void run() {
    37. sharedObject.write(message);
    38. }
    39. }
    40. public class ReaderThread extends Thread {
    41. private SharedObject sharedObject;
    42. public ReaderThread(SharedObject sharedObject) {
    43. this.sharedObject = sharedObject;
    44. }
    45. @Override
    46. public void run() {
    47. String message = sharedObject.read();
    48. System.out.println("Read message: " + message);
    49. }
    50. }
    51. public class Main {
    52. public static void main(String[] args) {
    53. SharedObject sharedObject = new SharedObject();
    54. WriterThread writerThread = new WriterThread(sharedObject, "Hello, World!");
    55. ReaderThread readerThread = new ReaderThread(sharedObject);
    56. writerThread.start();
    57. readerThread.start();
    58. }
    59. }
    1. 使用java.util.concurrent包中的锁:Java的并发库提供了多种锁,如ReentrantLock、ReentrantReadWriteLock等,这些锁比使用Object的wait/notify机制更灵活。
    2. 使用java.util.concurrent包中的并发集合:Java的并发库提供了一些并发集合,如ConcurrentHashMap、CopyOnWriteArrayList等,这些集合是为了解决线程安全问题而设计的。
    3. 使用java.util.concurrent包中的Future和Callable:Callable允许你返回一个结果,并且可以抛出一个受检查的异常。Future允许你检查计算是否完成,如果未完成,则阻塞直到完成。
    4. 使用java.util.concurrent包中的Semaphore和CyclicBarrier:Semaphore是一个计数信号量,用于保护一段代码或资源,防止同一时间多个线程访问。CyclicBarrier是一个同步辅助工具,它允许一组线程互相等待,直到所有线程都到达一个公共屏障点。
    5. 使用java.util.concurrent包中的CountDownLatch:CountDownLatch是一个同步辅助工具,它允许一个或多个线程等待,直到在其他线程执行的操作完成。
    6. 使用java.util.concurrent包中的Exchanger:Exchanger允许两个线程在某个点交换彼此的数据。
    7. 使用java.util.concurrent包中的SynchronousQueue:SynchronousQueue是一个没有容量的阻塞队列。每个插入操作必须等待一个相应的删除操作,反之亦然。
  • 相关阅读:
    java计算机毕业设计商场会员管理系统源码+系统+数据库+lw文档+mybatis+运行部署
    如何查找批量企业的联系方式?
    七月集训(第20天) —— 二叉搜索树
    [附源码]计算机毕业设计springboot在线图书销售系统
    ERROR: Cannot set priority of datanode
    卵清蛋白壳聚糖纳米粒的制备,OVA-CS纳米粒
    基于Echarts实现可视化数据大屏高速综合管控大数据
    强化您的应用安全,从app加固开始
    大文件上传,前端vue 做分片上传
    input 表单元素
  • 原文地址:https://blog.csdn.net/qq_34783818/article/details/134005707