Ошибка IllegalThreadStateException - Java
Формулировка задачи:
Суть игры заключается в том, что есть 3 круга красного цвета, случайным образом выбирается один из них и закрашивается в зеленый. В течении определенного промежутка времени (который постепенно будет уменьшаться) необходимо клацнуть на него мышкой, если этого не происходит, выбирается другой случайный круг. Вот, что у меня получилось
При запуске, после нажатия кнопки start выдает следующее:
Exception in thread "JavaFX Application Thread" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:708)
at yourreaction.YourReaction.GameProcess(YourReaction.java:109)
at yourreaction.YourReaction$1.handle(YourReaction.java:74)
at yourreaction.YourReaction$1.handle(YourReaction.java:72)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:748)
package yourreaction;
import javafx.application.Application;
import javafx.event.*;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.input.*;
import javafx.stage.Stage;
import javafx.scene.shape.Circle;
import javafx.scene.paint.Color;
import java.util.Vector;
import java.util.Random;
import java.util.concurrent.TimeUnit;
class NewThread implements Runnable {
Random random;
public static int randomNum;
NewThread() {
random = new Random();
}
public void run() {
randomNum = random.nextInt(YourReaction.AmountOfCircles);
YourReaction.circle[randomNum].setFill(Color.GREEN);
try {
Thread.sleep(2000);
} catch(InterruptedException ie) {System.out.println("IE");}
}
}
/*
class ProcessThread implements Runnable {
Random random;
public static int randomNum;
ProcessThread() {
random = new Random();
}
public void run() {
randomNum = random.nextInt(YourReaction.AmountOfCircles);
YourReaction.circle[randomNum].setFill(Color.GREEN);
}
}*/
public class YourReaction extends Application {
Scene scene;
VBox vbox;
public static Circle[] circle;
public static final int AmountOfCircles = 3;
public final int radius = 20;
public int score = 0;
public static void main(String[] args) {
launch(args);
}
public void start(Stage stage) {
stage.setTitle("Hello World!");
vbox = new VBox(5);
scene = new Scene(vbox, 300, 250);
stage.setScene(scene);
Button B_Start = new Button("Start");
Button B_Exit = new Button("Exit");
B_Start.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
GameProcess();
}
});
B_Exit.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
System.exit(0);
}
});
vbox.setAlignment(Pos.CENTER);
vbox.getChildren().addAll(B_Start, B_Exit);
stage.show();
}
public int GameProcess() {
vbox.getChildren().clear();
HBox hbox = new HBox(5);
hbox.setAlignment(Pos.CENTER);
scene.setRoot(hbox);
circle = new Circle[AmountOfCircles];
for(int i = 0; i < AmountOfCircles; i++) {
circle[i] = new Circle();
circle[i].setRadius(radius);
circle[i].setFill(Color.RED);
hbox.getChildren().add(circle[i]);
}
Thread t = new Thread(new NewThread());
while(score < 3) {
t.start();
circle[NewThread.randomNum].setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
circle[NewThread.randomNum].setFill(Color.RED);
score++;
}
});
/*
try {
Thread.sleep(timedir);
} catch(InterruptedException ie) {System.out.println("Interrupted exception!");}*/
}
//eventThread.interrupt();
return score;
}
}Решение задачи: «Ошибка IllegalThreadStateException»
textual
Листинг программы
package exp.dag;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import java.util.Random;
class NewThread implements Runnable {
public static int randomNum;
Random random;
NewThread() {
random = new Random();
randomNum = random.nextInt(YourReaction.AmountOfCircles); // лучше если это будет в конструкторе, иначе лишний код
}
public void run() {
YourReaction.circle[randomNum].setFill(Color.GREEN);
long startTime = System.currentTimeMillis();
while (System.currentTimeMillis() - startTime < 2000 && !YourReaction.clicked) { // если еще нет двух секунд и игрок еще не нажал
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class YourReaction extends Application {
public static final int AmountOfCircles = 3;
public static Circle[] circle;
static boolean clicked = false; // нажал на зеленую
public final int radius = 20;
public int score = 0;
Scene scene;
VBox vbox;
public static void main(String[] args) {
launch(args);
}
public void start(Stage stage) {
stage.setTitle("Hello World!");
vbox = new VBox(5);
scene = new Scene(vbox, 300, 250);
stage.setScene(scene);
Button B_Start = new Button("Start");
Button B_Exit = new Button("Exit");
B_Start.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
GameProcess();
}
});
B_Exit.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
System.exit(0);
}
});
vbox.setAlignment(Pos.CENTER);
vbox.getChildren().addAll(B_Start, B_Exit);
stage.show();
}
public int GameProcess() {
vbox.getChildren().clear();
HBox hbox = new HBox(5);
hbox.setAlignment(Pos.CENTER);
scene.setRoot(hbox);
circle = new Circle[AmountOfCircles];
for (int i = 0; i < AmountOfCircles; i++) {
circle[i] = new Circle();
circle[i].setRadius(radius);
circle[i].setFill(Color.RED);
hbox.getChildren().add(circle[i]);
}
new Thread(() -> { // иначе у тебя не будет доступа к окну. программа ждала бы пока выполнится while, т.е. бесконечно
while (score < 3) {
Thread t = new Thread(new NewThread()); // ошибка была тут, перезапустить существующий поток не получится, придется создать новый и запустить его
circle[NewThread.randomNum].setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
clicked = true;
score++;
}
});
clicked = false;
t.start();
try {
t.join(); // ждет пока выполнится поток
circle[NewThread.randomNum].setOnMousePressed(null); //
circle[NewThread.randomNum].setFill(Color.RED);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
//eventThread.interrupt();
return score;
}
}