黑马程序员技术交流社区
标题:
多线程 代码示例 来自毕老师视频教程
[打印本页]
作者:
fmi110
时间:
2015-7-19 11:57
标题:
多线程 代码示例 来自毕老师视频教程
多线程
/*需求:建立两个线程,一个进行输入人的信息,一个负责输出,两个线程交替运行
人的信息:name,sex
分析:1 输入输出的对象均是人
故人单独分类,成员变量 :name、sex;
同时提供访问和输出成员变量的方法:setInfo out
因为setInfo 和 out 两个方法可能被调用同时访问成员变量,因此需要进行同步,
只有一个方法访问问成员变量后,才能允许另一个访问。
2 输入及输出线程,可通过继承Runnable类,然后覆盖run方法实现
3 为确保输入输出线程处理的是同一对象,在创建线程时,应该将对象传递给线程
*/
/*版本一 待优化
class Res
{
private String name;
private String sex;
boolean flag = false; //用于标识输出或者输入
public void setInfo(String name,String sex)
{
this.name = name;
this.sex = sex;
}
public void out()
{
System.out.println(this.name + "..." + this.sex);
}
}
class Input implements Runnable
{
private Res r; //用于接收操作的对象
Input(Res r)
{
this.r = r;
}
public void run() //复写run方法,自定义线程的功能:输入信息,交替输入两个人的信息
{
int x = 0;
while(true)
{
synchronized(r)
{
if(r.flag)
try{r.wait();}catch (InterruptedException e){}
if(x==0)
r.setInfo("lisi","man");
else
r.setInfo("莉莉","女女");
x = (x+1)%2;
r.flag = (true); //设置输入完成
r.notify(); //唤醒输出
}
}
}
}
class Output implements Runnable
{
private Res r; //用于接收操作的对象
Output(Res r)
{
this.r = r;
}
public void run() //复写run方法,自定义线程的功能:输入信息,交替输入两个人的信息
{
while(true)
{
synchronized(r)
{
if(!r.flag)
try{r.wait();}catch (InterruptedException e){}
r.out();
r.flag = (false); //设置输出完成标志
r.notify(); //唤醒输入
}
}
}
}
*/
/*版本二 优化后*/
class Res
{
private String name;
private String sex;
private boolean flag = false; //用于标识输出或者输入
public synchronized void setInfo(String name,String sex)
{
if(flag)
try{this.wait();}catch (InterruptedException e){} //wait()会抛出异常(函数内,声明后抛或者catch),需要进行处理
this.name = name;
this.sex = sex;
flag = true; //设置输入完成标识
this.notify(); //唤醒输出
}
public synchronized void out()
{
if(!flag)
try{wait();}catch (InterruptedException e){}
System.out.println(this.name + "..." + this.sex);
flag = false; //设置输出完成标识
this.notify(); //唤醒输入
}
}
class Input implements Runnable
{
private Res r; //用于接收操作的对象
Input(Res r)
{
this.r = r;
}
public void run() //复写run方法,自定义线程的功能:输入信息,交替输入两个人的信息
{
int x = 0;
while(true)
{
if(x==0)
r.setInfo("lisi","man");
else
r.setInfo("莉莉","女女");
x = (x+1)%2;
}
}
}
class Output implements Runnable
{
private Res r; //用于接收操作的对象
Output(Res r)
{
this.r = r;
}
public void run() //复写run方法,自定义线程的功能:输入信息,交替输入两个人的信息
{
while(true)
{
r.out();
}
}
}
class InputOutputDemo
{
public static void main(String[] args)
{
Res r = new Res();
new Thread(new Input(r)).start();
new Thread(new Output(r)).start();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2