Java 使用 .wait(millis) 同步

Java synchronization using .wait(millis)

我有一个关于同步的"little problem",这是我的场景(我对同步还不够了解,我还在学习): (编辑)

        Thread work, progress;
        final Object myObject;
        work = new Thread(() -> {
            try {
                myObject.doSomething();
            } catch (IOException e) {e.printStackTrace();}
        });

        progress = new Thread(() -> {
            while (true) {
                System.out.println(myObject.progress());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    break;
                }
            }
        });

        work.setDaemon(true);
        progress.setDaemon(true);

        work.start();
        progress.start();

        work.join();
        progress.interrupt();
        progress.join();

        /*Other code*/

(编辑:可能已解决)

主要作业在WORK线程中完成,作业进度在PROGRESS线程中打印;

效果不错,但我想要更好的..."synchronization": 唯一的 'little' 问题是,如果我在 sleep 方法中放置 1 小时,也许工作已经完成并且必须等待 PROGRESS 线程终止的那 55 分钟...... 如何处理这种情况?我希望我的 PROGRESS 线程在作业完成时终止,而不是等待睡眠方法完成。 我想我将不得不使用一些同步块,以及 .wait(millis) 调用而不是 .sleep(millis)... 有人可以帮我理解吗?谢谢!

也许您可能想要查看 Observer/Listener 模式。简而言之,您的 Observer 在收到订阅的 class 通知之前不会执行任何操作。

http://www.javaworld.com/article/2077258/learn-java/observer-and-observable.html

// Your observable class
import java.util.Observable;
public class ObservableValue extends Observable
{
    private int n = 0;
    public ObservableValue(int n)
    {
        this.n = n;
    }
    public void setValue(int n)
    {
        this.n = n;
        setChanged();
        notifyObservers();
    }
    public int getValue()
    {
        return n;
    }
}


// Your observer
import java.util.Observer;
import java.util.Observable;
public class TextObserver implements Observer {
    private ObservableValue ov = null;
    public TextObserver(ObservableValue ov) {
        this.ov = ov;
    }
    public void update(Observable obs, Object obj) {
        if (obs == ov) {
            System.out.println(ov.getValue());
        }
    }
}


public class Main {
    public Main() {
        ObservableValue ov = new ObservableValue(0);
        TextObserver to = new TextObserver(ov);
        ov.addObserver(to);
    }
    public static void main(String [] args) {
        Main m = new Main();
    }
}

可以在此处找到将观察者模式与多线程一起使用的示例: https://dzone.com/articles/the-observer-pattern-using-modern-java

解决这个问题的一个有趣的方法是使用 Reactive 原则。在此视频中可以看到快速演示和解释: https://www.youtube.com/watch?v=weWSYIUdX6c