Javaマルチスレッド小練習、目覚まし時計

2957 ワード

package com.konghao.test;
// 
public class Alarm implements Runnable {
    private boolean isWork; // 
    

    public Alarm() {
        super();
        this.isWork = false; // ;
    }

    public boolean isWork() {
        return isWork;
    }


    public void setWork(boolean isWork) {
        this.isWork = isWork;
    }


    // 
    public void work(){
        synchronized (this) {
            // , 
            if(isWork){
                System.out.println("it's time for up!");
                this.notify();
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else{
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            this.setWork(true);
            work();
        }
    }
    
}
package com.konghao.test;
// 
public class User implements Runnable{
    private String name;
    private Alarm myAlarm;
    
    public User(String name, Alarm myAlarm) {
        super();
        this.name = name;
        this.myAlarm = myAlarm;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Alarm getMyAlarm() {
        return myAlarm;
    }
    public void setMyAlarm(Alarm myAlarm) {
        this.myAlarm = myAlarm;
    }
    public void stopAlarm(){
        synchronized (myAlarm) {
            if(myAlarm.isWork()){
                myAlarm.setWork(false);
                System.out.println(this.name+" !");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally{
                    myAlarm.notify();
                    try {
                        myAlarm.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }else{
                try {
                    myAlarm.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    @Override
    public void run() {
        while(true){
            stopAlarm();
        }
        
    }
    
}
// 
package com.konghao.test;

public class Test {
    public static void main(String[] args) {
        Alarm al = new Alarm();
        User u = new User(" ",al);
        Thread ut = new Thread(u);
        Thread at = new Thread(al);
        
        ut.setDaemon(true);
        ut.start();
        at.start();
    }
    
    
}