多线程的小练习
需求:实现一次修改一次输出
主要知识点:多线程,同步,等待和唤醒
public class inAndOut {
/**
* @param args
*/
public static void main(String[] args) {
// 1、两个线程控制同一个对象 参数传入
// 2、同步 变性问题(赋值到一半就输出了)
// 3、一次修改一次输出 wait 和 notify
Test tt = new Test(); // 给两个不同现成提供同一个对象
In in = new In(tt);
Out out = new Out(tt);
Thread ti = new Thread(in);
Thread to = new Thread(out);
ti.start();
to.start();
}
}
class In implements Runnable{
private Test r;
private boolean a = true;
@Override
public void run() {
while(true){
synchronized (r) { //处理变性问题
if(r.b){ // 修改为一条输出一条 现成的等待和唤醒 in执行时,out等待。 执行完后唤醒,out执行,in等待。。。。
if(a){ // 模拟不同的输入
r.name = "zhangsan";
r.sex = "nan";
a = false;
}else{
r.name = "lisi";
r.sex = "nv";
a=true;
}
r.b=false;
r.notify(); // 唤醒进程
}else{
try {
r.wait(); //当前进程等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
In(Test r){
this.r = r;
}
}
class Out implements Runnable{
private Test r;
@Override
public void run() {
while(true){
synchronized (r) {
if(!r.b){
System.out.println(r.name+"..."+r.sex);
r.b = true;
r.notify();
}else{
try {
r.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Out(Test r){
this.r = r;
}
}
class Test{
String name;
String sex;
boolean b = true;
}
网友评论