java 大道至简--多线程(7)
内容目录:
1、线程之间的通信
2、并发线程
正文:
前面的文章我们已经了解线程类Thread的大部分函数的使用方法,现在我们来探讨一下多线程开发经常遇见的一些问题
一、线程之间的通信
线程之间的通信是指多个线程之间,如何进行数据获取
上代码之前,我们先简单了解一下线程获取数据的原理(其实前面我们已经讲果鸟),知其然我们还要知其所以然,如果哪位看官想直接从这里获得某个问题的具体代码,那你可能要失望了
原理:先用一张图来简单的描述一下
程序里面的对象会放进内存里面,然后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()即唤醒