public class Info {
private String TAG = "Info";
private String name = "Rollen";
private int age = 20;
private boolean flag = false;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public synchronized void set(String name, int age){
if(!flag){
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
}
this.name = name;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.age = age;
flag = false;
super.notify();
}
public synchronized void get(){
if(flag){
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(TAG, "get() -- "+this.name + " - " + this.age);
flag = true;
super.notify();
}
}
public class Product implements Runnable{
private Info info = null;
public Product(Info info){
this.info = info;
}
public void run() {
boolean flag = false;
for (int i = 0; i < 25; i++) {
if(flag){
info.set("Rollen", 20);
flag = false;
}else{
info.set("ChunGe", 100);
flag = true;
}
}
}
}
public class Consumer implements Runnable{
private Info info = null;
public Consumer(Info info){
this.info = info;
}
public void run() {
for (int i = 0; i < 25; i++) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
info.get();
}
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init(){
Info info = new Info();
Product product = new Product(info);
Consumer consumer = new Consumer(info);
new Thread(product).start();
new Thread(consumer).start();
}
}
输出结果:
04:06:37.452: D/Info(1083): get() -- Rollen - 20
04:06:37.662: D/Info(1083): get() -- ChunGe - 100
04:06:37.862: D/Info(1083): get() -- Rollen - 20
04:06:38.072: D/Info(1083): get() -- ChunGe - 100
04:06:38.282: D/Info(1083): get() -- Rollen - 20
04:06:38.482: D/Info(1083): get() -- ChunGe - 100
04:06:38.682: D/Info(1083): get() -- Rollen - 20
04:06:38.892: D/Info(1083): get() -- ChunGe - 100
04:06:39.092: D/Info(1083): get() -- Rollen - 20
04:06:39.302: D/Info(1083): get() -- ChunGe - 100
04:06:39.502: D/Info(1083): get() -- Rollen - 20
04:06:39.702: D/Info(1083): get() -- ChunGe - 100
04:06:39.902: D/Info(1083): get() -- Rollen - 20
04:06:40.112: D/Info(1083): get() -- ChunGe - 100
04:06:40.312: D/Info(1083): get() -- Rollen - 20
04:06:40.512: D/Info(1083): get() -- ChunGe - 100
04:06:40.722: D/Info(1083): get() -- Rollen - 20
04:06:40.912: D/Info(1083): get() -- ChunGe - 100
04:06:41.122: D/Info(1083): get() -- Rollen - 20
04:06:41.332: D/Info(1083): get() -- ChunGe - 100
04:06:41.542: D/Info(1083): get() -- Rollen - 20
04:06:41.742: D/Info(1083): get() -- ChunGe - 100
04:06:41.952: D/Info(1083): get() -- Rollen - 20
04:06:42.152: D/Info(1083): get() -- ChunGe - 100
04:06:42.352: D/Info(1083): get() -- Rollen - 20
请问一下:
为什么打印的结果会交替的这么规律?
生产类和消费类的两个线程的运行状态是怎样的,为什么会一个get对一个set,没有乱掉,当set() wait()的时候,get()运行,运行完成后notify(),这时是set()运行还是下一个get运行?这个时序搞不太清楚?请清楚这一块的同仁,给以指点,尽量详细一些。对wait(),notify(),和synchronized 方法 的用法,没弄的太明白,非常感谢。