java 大道至简--多线程(7)

java 大道至简--多线程(7)

内容目录:

1、线程之间的通信

2、并发线程

正文:

前面的文章我们已经了解线程类Thread的大部分函数的使用方法,现在我们来探讨一下多线程开发经常遇见的一些问题

 

一、线程之间的通信

线程之间的通信是指多个线程之间,如何进行数据获取

上代码之前,我们先简单了解一下线程获取数据的原理(其实前面我们已经讲果鸟),知其然我们还要知其所以然,如果哪位看官想直接从这里获得某个问题的具体代码,那你可能要失望了

 

扫描二维码关注公众号,回复: 1708672 查看本文章

原理:先用一张图来简单的描述一下

 

程序里面的对象会放进内存里面,然后CPU会从内存里面,读取数据,进行处理,处理完后再返回到相应的内存,程序从内存里面取数据

所谓的线程之间的通信归根到底,就是分别获取内存里面的数据,表面上看起来就像人人之间的对话,你问一句我答一句,看起来就像是在对话,其实还是各自搞各自的

 

下面我们使用一个场景,老师和学生对话,来模拟一下所谓线程之间的通信

 情景:

  学生问老师问题,学生问一句,老师答一句,学生不问,老师不回答(因为没有问题)

 

一、新建工程,创建相应的类

 

二、内容详解

   Student,学生类,学生要向老师提问,提问是一个具体的动作,所以我们应该使用一个线程在说明这个具体的动作

   Teacher老师类,老师要回答学生的问题,回答也是一个具体的动作,所以我们也应该使用一个线程在说明这个具体的动作

package test;

public class Student implements Runnable{

@Override

public void run() {

// 具体的行为我们后面再分析

}

}

 

package test;

public class Teacher implements Runnable{

@Override

public void run() {

// 具体的行为我们后面再分析

}

}

       

     Content内容类,学生问老师问题大部分情况应该都是有具体的内容的,我们只进行动作描述

package test;

public class Content {

/**

 * 老师回答

 */

public synchronized void answer(String question){

}

/**

 * 学生提问

 */

Public synchronized void question(String question){

}

}

 

三、老师和学生的对话应该是围绕具体内容进行的,并且具体的对象应该要进行相应的动作,学生提问,老师回答

 package test;

public class Student implements Runnable{

Content content;

String question = "老师,明天高考,我能进清华吗?";

@Override

public void run() {

content.question(question);

}

}

 

package test;

public class Teacher implements Runnable{

Content content;

String question = "要相信自己,你一定可以实现你的梦想";

@Override

public void run() {

content.answer(question);

}

}

四、到上面为止,老师和学生各自的动作已经完成了,现在就要实现一问一答的场景,即学生提问,老师回答,学生不问,老师不回答

 

package test;

public class Content {

boolean flag = false;

/**

 * 老师回答

 */

public synchronized void answer(String answer){

if(!flag){

notify();

try {

wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println(answer);

flag = false;

}

/**

 * 学生提问

 */

public synchronized void question(String question){

if(flag){

notify();

try {

wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println(question);

flag = true;

}

}


结果:

学生:老师,我能进清华吗?

老师:要相信自己,你一定可以实现你的梦想


 程序详解:

  上面的学生类和老师类应该不需要过多的解释,如果理解起来有难度的童鞋请巩固一下自己的基础,说明你的基础还不牢,

  Wait() 来自 Object类,让当前线程等待

  Notify() 来自Object类,唤醒当前正在等待的线程

 

 question(String question) :学生提问没有结束的时候,老师是不会回答的,即当question()函数运行的时候,flag=true,又因为是多线程,即question()函数运行的时候,answer()也在运行,answer()会调用wait()让当前线程等待,直到flag=true时,会notify()即唤醒

猜你喜欢

转载自blog.csdn.net/xianghan_qq/article/details/80606067