简单来说,多线程之间的通讯就是两种,一种是共享内存型,一种是消息传递。

 

一、共享内存型,一般就是通过共享变量,计数器,信号量等方式。

常见的关键字:synchronized、lock、volatile。一般情况下,几个线程之间会共享一个变量,通过改变共享变量的值来实现线程直接的通讯,这种方式要注意变量原子性和一致性

例子:

创建共享信号量容器:

public static Map<String, Semaphore> semaphoreContainer = new ConcurrentHashMap<String, Semaphore>();

业务初始化信号量:

semaphoreContainer .put("A",new Semaphore(1)); //容量为1

线程A:

semaphoreContainer .get("A").tryAcquire();

线程B:

semaphoreContainer .get("A").tryAcquire();

保证线程A和线程B,不会同时发生,也可以根据信号量的剩余值,来进行。

 

二、消息传递型,值得就是不同线程之间,通过指令去告诉其他线程该做什么

常见的指令:wait,notify,join。基本就是A线程手动wait,然后通过其他线程唤醒,或者主动join其他线程,等待其他线程执行完毕

例子:

public static void main(String[] args){
 
   //注意,此线程是异步的,不和主线程同步
     Thread t = new Thread(new Runnable(){
          public void run(){
              // doSometing
          }
      }).start();
  
     // 调用join,等待t线程执行完毕
     try{
         t.join();
     }catch(InterruptedException e){
         
     }
 }

  

 消息传递还有一种,管道流的的消息传递,没实际用过,看例子很简单,创建PipedInputStream和PipedOutputStream,然后通过connect()方法将其连接。