Ошибка IllegalThreadStateException - Java

Узнай цену своей работы

Формулировка задачи:

Суть игры заключается в том, что есть 3 круга красного цвета, случайным образом выбирается один из них и закрашивается в зеленый. В течении определенного промежутка времени (который постепенно будет уменьшаться) необходимо клацнуть на него мышкой, если этого не происходит, выбирается другой случайный круг. Вот, что у меня получилось
Листинг программы
  1. package yourreaction;
  2. import javafx.application.Application;
  3. import javafx.event.*;
  4. import javafx.geometry.Pos;
  5. import javafx.scene.Scene;
  6. import javafx.scene.control.*;
  7. import javafx.scene.layout.*;
  8. import javafx.scene.input.*;
  9. import javafx.stage.Stage;
  10. import javafx.scene.shape.Circle;
  11. import javafx.scene.paint.Color;
  12. import java.util.Vector;
  13. import java.util.Random;
  14. import java.util.concurrent.TimeUnit;
  15. class NewThread implements Runnable {
  16. Random random;
  17. public static int randomNum;
  18. NewThread() {
  19. random = new Random();
  20. }
  21. public void run() {
  22. randomNum = random.nextInt(YourReaction.AmountOfCircles);
  23. YourReaction.circle[randomNum].setFill(Color.GREEN);
  24. try {
  25. Thread.sleep(2000);
  26. } catch(InterruptedException ie) {System.out.println("IE");}
  27. }
  28. }
  29. /*
  30. class ProcessThread implements Runnable {
  31. Random random;
  32. public static int randomNum;
  33. ProcessThread() {
  34. random = new Random();
  35. }
  36. public void run() {
  37. randomNum = random.nextInt(YourReaction.AmountOfCircles);
  38. YourReaction.circle[randomNum].setFill(Color.GREEN);
  39. }
  40. }*/
  41. public class YourReaction extends Application {
  42. Scene scene;
  43. VBox vbox;
  44. public static Circle[] circle;
  45. public static final int AmountOfCircles = 3;
  46. public final int radius = 20;
  47. public int score = 0;
  48. public static void main(String[] args) {
  49. launch(args);
  50. }
  51. public void start(Stage stage) {
  52. stage.setTitle("Hello World!");
  53. vbox = new VBox(5);
  54. scene = new Scene(vbox, 300, 250);
  55. stage.setScene(scene);
  56. Button B_Start = new Button("Start");
  57. Button B_Exit = new Button("Exit");
  58. B_Start.setOnMousePressed(new EventHandler<MouseEvent>() {
  59. public void handle(MouseEvent me) {
  60. GameProcess();
  61. }
  62. });
  63. B_Exit.setOnMousePressed(new EventHandler<MouseEvent>() {
  64. public void handle(MouseEvent me) {
  65. System.exit(0);
  66. }
  67. });
  68. vbox.setAlignment(Pos.CENTER);
  69. vbox.getChildren().addAll(B_Start, B_Exit);
  70. stage.show();
  71. }
  72. public int GameProcess() {
  73. vbox.getChildren().clear();
  74. HBox hbox = new HBox(5);
  75. hbox.setAlignment(Pos.CENTER);
  76. scene.setRoot(hbox);
  77. circle = new Circle[AmountOfCircles];
  78. for(int i = 0; i < AmountOfCircles; i++) {
  79. circle[i] = new Circle();
  80. circle[i].setRadius(radius);
  81. circle[i].setFill(Color.RED);
  82. hbox.getChildren().add(circle[i]);
  83. }
  84. Thread t = new Thread(new NewThread());
  85. while(score < 3) {
  86. t.start();
  87. circle[NewThread.randomNum].setOnMousePressed(new EventHandler<MouseEvent>() {
  88. public void handle(MouseEvent me) {
  89. circle[NewThread.randomNum].setFill(Color.RED);
  90. score++;
  91. }
  92. });
  93. /*
  94. try {
  95. Thread.sleep(timedir);
  96. } catch(InterruptedException ie) {System.out.println("Interrupted exception!");}*/
  97. }
  98. //eventThread.interrupt();
  99. return score;
  100. }
  101. }
При запуске, после нажатия кнопки 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)

Решение задачи: «Ошибка IllegalThreadStateException»

textual
Листинг программы
  1. package exp.dag;
  2.  
  3. import javafx.application.Application;
  4. import javafx.event.EventHandler;
  5. import javafx.geometry.Pos;
  6. import javafx.scene.Scene;
  7. import javafx.scene.control.Button;
  8. import javafx.scene.input.MouseEvent;
  9. import javafx.scene.layout.HBox;
  10. import javafx.scene.layout.VBox;
  11. import javafx.scene.paint.Color;
  12. import javafx.scene.shape.Circle;
  13. import javafx.stage.Stage;
  14.  
  15. import java.util.Random;
  16.  
  17. class NewThread implements Runnable {
  18.     public static int randomNum;
  19.     Random random;
  20.  
  21.     NewThread() {
  22.         random = new Random();
  23.         randomNum = random.nextInt(YourReaction.AmountOfCircles);       // лучше если это будет в конструкторе, иначе лишний код
  24.     }
  25.  
  26.     public void run() {
  27.         YourReaction.circle[randomNum].setFill(Color.GREEN);
  28.         long startTime = System.currentTimeMillis();
  29.         while (System.currentTimeMillis() - startTime < 2000 && !YourReaction.clicked) {  // если еще нет двух секунд и игрок еще не нажал
  30.             try {
  31.                 Thread.sleep(1);
  32.             } catch (InterruptedException e) {
  33.                 e.printStackTrace();
  34.             }
  35.         }
  36.  
  37.     }
  38. }
  39.  
  40.  
  41. public class YourReaction extends Application {
  42.     public static final int AmountOfCircles = 3;
  43.     public static Circle[] circle;
  44.     static boolean clicked = false;             // нажал на зеленую
  45.     public final int radius = 20;
  46.     public int score = 0;
  47.     Scene scene;
  48.     VBox vbox;
  49.  
  50.     public static void main(String[] args) {
  51.         launch(args);
  52.     }
  53.  
  54.     public void start(Stage stage) {
  55.         stage.setTitle("Hello World!");
  56.  
  57.         vbox = new VBox(5);
  58.  
  59.         scene = new Scene(vbox, 300, 250);
  60.  
  61.         stage.setScene(scene);
  62.  
  63.         Button B_Start = new Button("Start");
  64.         Button B_Exit = new Button("Exit");
  65.  
  66.         B_Start.setOnMousePressed(new EventHandler<MouseEvent>() {
  67.             public void handle(MouseEvent me) {
  68.                 GameProcess();
  69.             }
  70.         });
  71.  
  72.         B_Exit.setOnMousePressed(new EventHandler<MouseEvent>() {
  73.             public void handle(MouseEvent me) {
  74.                 System.exit(0);
  75.             }
  76.         });
  77.  
  78.         vbox.setAlignment(Pos.CENTER);
  79.         vbox.getChildren().addAll(B_Start, B_Exit);
  80.  
  81.         stage.show();
  82.     }
  83.  
  84.     public int GameProcess() {
  85.         vbox.getChildren().clear();
  86.  
  87.         HBox hbox = new HBox(5);
  88.         hbox.setAlignment(Pos.CENTER);
  89.         scene.setRoot(hbox);
  90.  
  91.         circle = new Circle[AmountOfCircles];
  92.  
  93.         for (int i = 0; i < AmountOfCircles; i++) {
  94.             circle[i] = new Circle();
  95.             circle[i].setRadius(radius);
  96.             circle[i].setFill(Color.RED);
  97.             hbox.getChildren().add(circle[i]);
  98.         }
  99.  
  100.  
  101.         new Thread(() -> {                  // иначе у тебя не будет доступа к окну. программа ждала бы пока выполнится while, т.е. бесконечно
  102.             while (score < 3) {
  103.                 Thread t = new Thread(new NewThread());         // ошибка была тут, перезапустить существующий поток не получится, придется создать новый и запустить его
  104.  
  105.                 circle[NewThread.randomNum].setOnMousePressed(new EventHandler<MouseEvent>() {
  106.                     public void handle(MouseEvent me) {
  107.                         clicked = true;
  108.                         score++;
  109.                     }
  110.                 });
  111.  
  112.                 clicked = false;
  113.                 t.start();
  114.  
  115.                 try {
  116.                     t.join();               // ждет пока выполнится поток
  117.                     circle[NewThread.randomNum].setOnMousePressed(null);        //
  118.                     circle[NewThread.randomNum].setFill(Color.RED);
  119.                 } catch (InterruptedException e) {
  120.                     e.printStackTrace();
  121.                 }
  122.  
  123.             }
  124.         }).start();
  125.  
  126.         //eventThread.interrupt();
  127.  
  128.         return score;
  129.     }
  130. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут