Запуск нескольких таймеров при планировании двух задач таймера во время игры с человеческим процессором

#java #timer #illegalstateexception #timertask

#java #таймер #исключение illegalstateexception #timertask

Вопрос:

снова. Я продолжаю получать IllegalStateException , когда пытаюсь выполнить задачу после одного хода. В частности, упоминание о том, что задача уже запланирована или отменена. Вы знаете, как это исправить? Вот некоторый соответствующий код.

 public class Human_Agent implements GipfPlayable {

    String[] edgeSpots;
    String[] columns;
    Random rng;
    GipfGame mg;
    //int turn = 0;
    String str;
    Timer t;
    Integer val;
    Integer myDir;
    public Human_Agent(GipfGame g) {
        this.edgeSpots = g.getEdgeSpots();
        this.columns = g.getColumns();
        rng = new Random(37);
        //turn = 0;
    }
    TimerTask task1 = new TimerTask()
    {
        public void run()
        {

            if (str.equals(""))
            {
                System.out.println("You did not input a valid location.");
                System.exit(0);
            }

        }
    };
    TimerTask task2 = new TimerTask()
    {
        public void run()
        {

            if (val == null)
            {
                System.out.println("You did not input a valid direction.");
                System.exit(0);
            }
        }
    };

    public String getUserInput() throws Exception
    {
        t = new Timer();
        t.schedule(task1, 5*1000);
        Scanner scan = new Scanner(System.in);
        System.out.print("Please provide a starting location: ");
        String startLocation = "";
        String x = scan.nextLine();
        str = x;
        int dirE = 0;
        //t.cancel();
       // Timer t2 = new Timer();
        if (isItValidLocation(x))
        {
        startLocation = x;
        t.cancel();
        t = new Timer();
        t.schedule(task2, 10*1000);
        //t.scheduleAtFixedRate(task2, 5000, 5*1000);
        System.out.print("n Now, provide a number to move the piece");
         dirE = scan.nextInt();
         t.cancel();
        }
        else
        {
            System.out.println("Invalid Start location.");
            t.cancel();
        }
       // scan.close();
       // t.cancel();
         return str   " "   Integer.toString(dirE);
    }
    @Override
    public String makeGipfMove() {
        String s;
        try
        {
            s = getUserInput();
        }
        catch(Exception e)
        {
        String startLocation = edgeSpots[rng.nextInt(edgeSpots.length)];
        Integer dir = rng.nextInt(6);
        s = startLocation   " "   Integer.toString(dir);
        e.printStackTrace();
        }

//        if ((mg.makeMove(x, dirE)) == false)
//        {
//            System.out.println("Can't move here.");
//        }
        //mg.makeMove(x, dirE);
       // Integer dir = rng.nextInt(6);
        //System.out.println("GIPHS REMAINING: "   )

       return s;
    }
    public boolean isItValidLocation(String a)
    {
        boolean v = false;
        System.out.println("YOU ENTERED: "   a);
        for (int i = 0; i < edgeSpots.length; i  )
        {
            System.out.println(edgeSpots[i]);
            if ((edgeSpots[i].equals(a)) amp;amp; (v != true))
            {
                 v = true;
            }

        }
        System.out.println(v);
        return v;
    }

}
  

Что делает этот код, так это играет в игру Gipf с агентом-человеком.

Похоже, что ваш пост в основном состоит из кода; пожалуйста, добавьте еще несколько деталей. (Netbeans необходимо избавиться от этого, если вы добавили сведения о своем коде!)

Комментарии:

1. Что делает один ход, так это ввод местоположения и направления для перемещения фигуры gipf

2. «Похоже, что ваш пост в основном состоит из кода; пожалуйста, добавьте еще несколько деталей. (Netbeans необходимо избавиться от этого, если вы добавили сведения о своем коде!)» — зачем публиковать ненужный текст? Почему бы вместо этого не добавить больше текста, который объясняет весь этот код и вашу проблему более подробно?

3. К вашему сведению, это исключение IllegalStateException

Ответ №1:

Точно так же, как вы не можете повторно использовать a Timer после его отмены, вы не можете повторно использовать a TimerTask .

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