Следует ли мне использовать уведомление и ждать, даже когда есть только один поток? - PullRequest
0 голосов
/ 19 июня 2020
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class MyLabel extends JLabel {
    int barSize = 0;
    int maxBarSize;

    MyLabel(int maxBarSize) {
        this.maxBarSize = maxBarSize;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.magenta);
        int width = (int) (((double) (this.getWidth())) / maxBarSize * barSize);
        if (width == 0)
            return;
        g.fillRect(0, 0, width, this.getHeight());
    }

    synchronized void fill() {
        if (barSize == maxBarSize) {
            try {
                wait(); 
            } catch (InterruptedException e) {
                return;
            }
        }
        barSize++;
        repaint();
        notify();
    }

    synchronized void consume() {
        if (barSize == 0) {
            try {
                wait(); 
            } catch (InterruptedException e) {
                // TODO: handle exception
                return;
            }
        }
        barSize--;
        repaint();
        notify();
    }
}

class ConsumerThread extends Thread {
    MyLabel bar;

    ConsumerThread(MyLabel bar) {
        this.bar = bar;
    }

    public void run() {
        while (true) {
            try {
                sleep(200);
                bar.consume();
            } catch (InterruptedException e) {
                // TODO: handle exception
                return;
            }
        }
    }
}

public class TabAndThreadEx extends JFrame {
    MyLabel bar = new MyLabel(100);

    TabAndThreadEx(String title) {
        super(title);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(null);
        bar.setBackground(Color.orange);
        bar.setOpaque(true);
        bar.setLocation(20, 50);
        bar.setSize(300, 20);
        c.add(bar);

        c.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                bar.fill();
            }
        });
        setSize(350, 200);
        setVisible(true);

        c.requestFocus();
        ConsumerThread th = new ConsumerThread(bar);
        th.start();
    }

    public static void main(String[] args) {
        new TabAndThreadEx("press any key");
    }
}

Это программа Java, которая создает полосу, которая заполняется при нажатии клавиши, и размер полосы уменьшается, когда нет ввода клавиш.

Что происходит если вы не используете wait и notify в методах fill и consum класса MyLabel?

Поток занимает только одну часть ConsumerThread, поэтому мне не нужно использовать wait и notify.

Нужно ли мне ждать и уведомлять, когда есть только один поток? Если да, то почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...