简单来说,多线程之间的通讯就是两种,一种是共享内存型,一种是消息传递。
一、共享内存型,一般就是通过共享变量,计数器,信号量等方式。
常见的关键字: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()方法将其连接。