package cn.zhh.thread;
public class ThreadDemo {
public static void main(String[] args) {
//创建一个学生对象
Student s = new Student();
s.setName("Tom");
s.setGendar("男");
//创建2个Ask的线程负责问问题
new Thread(new Ask(s)).start();
new Thread(new Ask(s)).start();
//创建2个Change的线程负责更改学生的信息
new Thread(new Change(s)).start();
new Thread(new Change(s)).start();
}
}
class Change implements Runnable{
private Student s;
public Change(Student s){
this.s = s;
}
@Override
public void run() {
while(true){
synchronized(s){
while(s.flag==true){
try {
//让线程进入线程池等待
s.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(s.getGendar().equals("男")){
s.setName("Amy");
s.setGendar("女");
}else{
s.setName("Tom");
s.setGendar("男");
}
s.setFlag(true);
//唤醒等待的线程
// s.notify();
//唤醒所有的等待的线程
s.notifyAll();
}
}
}
}
class Ask implements Runnable{
private Student s;
//持有Student的对象
public Ask(Student s){
this.s = s;
}
@Override
public void run() {
while(true){
synchronized (s) {
//判断是否还是当前类型的线程抢到执行权,如果是,则让该线程一直等待
while(s.flag == false){
try {
s.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("i am"+s.getName()+","+s.getGendar());
System.out.println("ask question");
s.setFlag(false);
// s.notify(); 如果只有1个ask线程和一个change线程则可以使用该方法
s.notifyAll();
}
}
}
}
class Student{
private String name;
private String gendar;
//标记位:规定flag为true,执行ask,如果flag为false,执行change
public boolean flag = true;
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGendar() {
return gendar;
}
public void setGendar(String gendar) {
this.gendar = gendar;
}
}
Thread线程使用等待唤醒机制实现线程交替执行任务
最新推荐文章于 2023-03-16 16:29:28 发布