java swing краска с многопоточностью - PullRequest
0 голосов
/ 30 ноября 2011

Я пытался создать лабиринт, по которому два прямоугольника будут перемещаться в зависимости от некоторых правил. Проблема в том, что мне приходится использовать многопоточность и пул потоков. Я никогда не пробовал многопоточность и немного нового в Java. Я написал несколько кодовЯ проверяю его. Он работает, но когда я хотел показать текущий идентификатор потока (чтобы доказать, что два потока работают одновременно), я получаю четыре разных номера потока. Я не уверен, что это многопоточность. Пожалуйста, если у вас есть идея,скажите мне, что я должен сделать. Спасибо.

class Action  extends JPanel{
Robot robot1,robot2;
public static Random rndm=new Random();
public Action() throws InterruptedException{
    ExecutorService pool=Executors.newFixedThreadPool(2);
    robot1=new Robot(0,560); // starts random free position
    robot2=new Robot(0,560);
    pool.submit(robot1);
     System.out.println("rbt1 olustu");
    pool.submit(robot2);
     System.out.println("rbt2 olustu");
    pool.shutdown();
}

@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    robot1.MyDraw(g);
     System.out.println("robot1 drawing");
    robot2.MyDraw(g);
      System.out.println("robot2 drawing");
}
class Robot implements Runnable{
    int x;
    int y;

    Robot(int xCor,int yCor){
        this.x=xCor;
        this.y=yCor;
        new Thread(this).start();

    }

    public void MyDraw(Graphics g){
        if(end==false){
        Image img1 = Toolkit.getDefaultToolkit().getImage("cat.jpg");
        g.drawImage(img1, x, y,null);}

       else{
        g.setColor(Color.white);
        g.drawRect(x, y, 40,40);

      }
    }
 public void run() {
        if(Frame.control==true){
        while(true){
            if(end==false){
                decision(x,y);  
                visitedCell[x/40][y/40]+=1;
                try{
                    Thread.sleep(300);
                    repaint();
                }catch(Exception ex){
                    ex.printStackTrace();
                }
                System.out.println(Thread.currentThread().getId());
                } 

              else{
                Thread.currentThread().interrupt();
                System.out.println("Thread dead");

                Frame.button4.setEnabled(true);
              }
        }

(я не помещал здесь метод solution () немного долго. Он просто вычисляет новые координаты x, y)

1 Ответ

1 голос
/ 30 ноября 2011

Когда вы используете ExecutorService, вам не нужно делать ничего, что напрямую работает с потоками.Сервис делает это для вас.В конструкторе вы делаете (и запускаете поток) выполнение вашего метода run.Затем, когда вы добавляете их в пул, служба executor берет 2 Runnables и запускает их в двух потоках в пуле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...