多线程之间的通讯机制
简单来说,多线程之间的通讯就是两种,⼀种是共享内存型,⼀种是消息传递。
⼀、共享内存型,⼀般就是通过共享变量,计数器,信号量等⽅式。
常见的关键字:synchronized、lock、volatile。⼀般情况下,⼏个线程之间会共享⼀个变量,通过改变共享变量的值来实现线程直接的通讯,这种⽅式要注意变量原⼦性和⼀致性
例⼦:
创建共享信号量容器:
public static Map<String, Semaphore> semaphoreContainer = new ConcurrentHashMap<String, Semaphore>();
业务初始化信号量:
semaphoreContainer .put("A",new Semaphore(1)); //容量为1
pipedinputstream线程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()⽅法将其连接。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论