- 博客分类:
星期一, 十二月 07, 2015 21:07:55
六、线程间的通信
本节介绍线程间通信,具体介绍问题的引出和问题如何解决等内容。
6.1问题的引出
例子:
把一个数据存储空间化为两部分:
1.存储人的姓名 2.存储人的性别
这里包含两个线程:
1.一个线程向数据存储空间添加数据(生产者)
2.一个线程从数据存储空间中取出数据(消费者)
这个程序有两种意外需要考虑:
1.假设生产者线程刚向数据存储空间中添加了一个人的姓名,还没有加入这个人的性别,
cpu就切换到了消费者线程,消费者线程则把这个人的姓名和上个人的性别联系到了一起。
2.生产者放入了若干次数据,消费者才开始取数据,或者是,消费者取完一个数据后,
还没等到生产者放入新的数据,又重复取出已取过的数据。
伦理片 http://www.dotdy.com/
6.2问题如何解决
构思程序,程序中的生产者线程和消费者线程运行的是不同的程序代码,因此这里需要编写两个包含
有run方法的类完成这两个线程,一个是生产者类Producer,另一个是消费者类Consumer。
6.2线程之间的通信,代码案例
- package day35;
- public class ThreadCommunication {
- public static void main(String[] args){
- P q = new P();
- new Thread(new Producer(q)).start();
- new Thread(new Consumer(q)).start();
- }
- }
- //数据存储空间
- class P {
- String name = "waxun";
- String sex = "girl";
- }
- //生产者
- class Producer implements Runnable{
- P q = null;
- public Producer(P q) {
- this.q = q;
- }
- @Override
- public void run() {
- // TODO Auto-generated method stub
- int i = 0;
- while(true) {
- if(i == 0) {
- q.name = "yuz";
- q.sex = "boy";
- }else{
- q.name = "waxun";
- q.sex = "girl";
- }
- i = (i+1)%2;
- }
- }
- }
- //消费者
- class Consumer implements Runnable{
- P q = null;
- public Consumer(P q) {
- this.q = q;
- }
- @Override
- public void run() {
- // TODO Auto-generated method stub
- while(true) {
- System.out.println(q.name+"--->"+q.sex);
- }
- }
- }
注意:
姓名和性别不对应,Consumer类和Producer都是操作了p类,这就
有可能Producer类还未操纵完P类,Consumer类就已经将P类中的内容取走了,
这就是资源部同步的原因。
为此可以在P类中增加两个同步方法:set()和get()。
6.3进程同步使用
影音先锋电影 http://www.iskdy.com/
- package day35;
- public class ThreadCommunication {
- public static void main(String[] args){
- P q = new P();
- new Thread(new Producer(q)).start();
- new Thread(new Consumer(q)).start();
- }
- }
- //数据存储空间
- class P {
- String name = "waxun";
- String sex = "girl";
- public synchronized void set(String name,String sex){
- this.name = name;
- this.sex = sex;
- }
- public synchronized void get(){
- System.out.println(this.name+"--->"+this.sex);
- }
- }
- //生产者
- class Producer implements Runnable{
- P q = null;
- public Producer(P q) {
- this.q = q;
- }
- @Override
- public void run() {
- // TODO Auto-generated method stub
- int i = 0;
- while(true) {
- if(i == 0) {
- q.set("yuz", "boy");
- }else{
- q.set("waxun", "girl");
- }
- i = (i+1)%2;
- }
- }
- }
- //消费者
- class Consumer implements Runnable{
- P q = null;
- public Consumer(P q) {
- this.q = q;
- }
- @Override
- public void run() {
- // TODO Auto-generated method stub
- while(true) {
- q.get();
- }
- }
- }