Как восстановить поток из заблокированного в работоспособное состояние?

Контекст:

Я пишу небольшую программу на Java, чтобы троллить моих друзей. Эта программа, когда запускается, спамит экран множеством маленьких окон, чтобы блокировать обзор и отставать от машины. В попытке увеличить скорость появления окон, я попытался создать несколько потоков, каждый из которых отображает спам на экране.

Проблема и вопрос:

Когда я получаю состояние каждого потока, запускается только один, а остальные блокируются, что не приводит к увеличению скорости спама в окне. Как я могу предотвратить блокировку этих тем?


-Код-


Основной класс - создает потоки и печатает их состояние через 1 секунду

public class Init {
    public static void main(String[] args) throws InterruptedException {

        ArrayList<Thread> list = new ArrayList();

        for(int i = 0; i < 4; i++) {
            Thread t = new Thread(new MyThread());
            t.start();
            list.add(t);
        }

        //Print each Thread's name and state after 1 second
        Thread.sleep(1000);
        for(Thread t : list) {
            System.out.println(t.getName() + " " + t.getState());
        }
    }
}

Вывод состояния потока

Thread-0 BLOCKED
Thread-1 BLOCKED
Thread-2 BLOCKED
Thread-3 RUNNABLE

Класс спама - бесконечно создает новые окна и размещает их в произвольном месте на экране

public class Spam {

    JFrame window;
    Random r;
    Dimension screenSize;
    int x;
    int y;

    public Spam() {

        screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        r = new Random();

        while(true) {
            x = r.nextInt((int)screenSize.getWidth());
            y = r.nextInt((int)screenSize.getHeight());
            x -= 100;
            y -= 100;
            window = new JFrame();
            window.setSize(100, 100);
            window.setLocation(x,  y);
            window.setBackground(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256))); //set window to random color
            window.setVisible(true);
        }
    }
}

Класс потока - каждый экземпляр создает один класс Spam

public class MyThread implements Runnable {

    @Override
    public void run() {
        try {
            new Spam();
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

1 ответ

Thread.BLOCKED

... Поток в заблокированном состоянии ожидает блокировки монитора, чтобы войти в синхронизированный блок / метод или повторно войти в синхронизированный блок / метод после вызова Object.wait,

Итак, когда-нить в WAITING состояние (ожидание блокировки монитора) переходит в BLOCK состояние, и как только он приобретает монитор, то он входит в RUNNABLE государство.

Другие вопросы по тегам