1.创建Cat类:
import java.io.Serializable;
public class Cat implements Serializable {
private String name;
private Integer age;
private boolean flag=true;
private boolean myw=true;
public Cat(String name, Integer age) {
this.name = name;
this.age = age;
}
public Cat() {
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public boolean getFlag() {
return flag;
}
public boolean getMyw() {
return myw;
}
public void setMyw(boolean myw) {
this.myw = myw;
}
}
2.创建线程1:
public class Thread1Tel extends Thread{
private Cat cat;//通过测试类 拿到同1个锁
public Thread1Tel(Cat cat) {
this.cat = cat;
}
@Override
public void run() {
while (true){
synchronized (cat){
if(!cat.getMyw()){
try {
cat.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (cat.getFlag()){
cat.setName("ketty");
cat.setAge(7);
cat.setFlag(false);
}
else if(cat.getFlag()==false){
cat.setName("sussan");
cat.setAge(23);
cat.setFlag(true);
}
cat.setMyw(false);
cat.notify();
}
}
}
}
3.创建线程2:
public class Thread2Tel extends Thread{
private Cat cat;//通过测试类 拿到同1个锁
public Thread2Tel(Cat cat) {
this.cat = cat;
}
@Override
public void run() {
while (true){
synchronized (cat){
if(cat.getMyw()){
try {
cat.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(cat);
cat.setMyw(true);
cat.notify();
}
}
}
}
4.创建 测试类:
public class TelTest {
public static void main(String[] args) {
Cat cat = new Cat();
new Thread1Tel(cat).start();
new Thread2Tel(cat).start();
}
}
5.运行结果:
6.总结:
线程中的通信 不能用this锁-------每个对象的this不同 相当于2个都各有各的不同的2个锁
用类锁 类锁只有1个
或者用 构造函数传过来的同1个 cat对象。
wait会释放锁资源,sleep不会;
notify 或 notifyAll 唤醒。