Как восстановить поток из заблокированного в работоспособное состояние?
Контекст:
Я пишу небольшую программу на 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
государство.