一、通讯模型
线程通信初步接触
多线程程序的应用,是为了提高程序性能和灵活性,为了让程序能并行的执行一些工作,比如一个线程负责将系统中的消息存入数据库,另一个线程负责接收消息;这就需要多个线程的协同工作---即线程间的通信。
“监视线程”通讯模型同时多个独立线程在运行,运行状态由第三方监控线程全程监控,这种模型为监视线程模型
二、线程同步问题及解决方法
同步问题 ,多线程程序可能存在的一个问题就是:可能会出现多个线程同时操作某一个对象的数据,结果就会出现线程对象对自己操作的数据不同步的情况。
synchronized代码块中的语句只能有一个线程在执行
任意一个对象都有一个标志位,有1和0两种状态
当程序执行到synchronized代码块的时候线程会检查对象的标志位是1还是0
如果是1则执行程序,同是将对象的标志位设置为0,其他线程执行到synchronized代码块时一看对象标志位为0 则线程会阻塞,一直等到对象的标志位为1再执行下面的程序
三、生产者消费者模型
模型规则
生产和消费线程共同操作一个集合,生产线程放入对象,消费线程取出对象!仅当集合中没有对象时,生产线程会放入一个对象,如有集合中有一个对象时,消费线程要马上取出这个对象。
wait/notify机制
在java中,每个对象都有从Object父类继承而来的两个关于线程间通讯的方法wait()和notify(),如其方法名所示,一个是等待,一个是通知,当在一个对象上调用wait()方法时,当前线程就会进行wait状态,直到收到另一个对象的notify()发出通知,才会执行下一步计算
在多线程通讯中,经常会用对象的这两个方法,一个典型的案例就是“生产/消费者模型”
阻塞队列-生产消费模型
LinkedBlockingQueue阻塞队列,阻塞在存放数据时使用了“阻塞”的机制
即当队列中有数据时,对阻塞队列的put()方法将用将会进入等待状态,直到队列中在空间放入数据;
从阻塞队列中取数据时,如果阻塞队列中还没有数据,take()方法就会一直等待,直到队列被放入一个数据对象时,take()方法才会返回这个对象;