2011-11-30 101 views
0

我一直在努力使两个矩形将移动取决于一些规则的迷宫。问题是我必须使用多线程和一个线程pool.I从来没有尝试过多线程和Java中有点新。我写了一些代码。我测试它。它正在工作,但是当我想要显示当前线程ID(以证明两个线程同时工作),我得到四个不同的线程数。名称我不确定它是多线程。请if你有一个想法,告诉我我必须做什么。谢谢。java swing swing与多线程

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); 
       } 
     } 

(我不把这里的决定()方法的位long.it只计算新的x,y坐标)

回答

1

当您使用ExecutorService,你不必做任何事情,直接作用与线程。该服务为您提供帮助。在构造函数中,你正在创建(并启动一个线程)来执行你的run方法。然后,当您将它们添加到池中时,执行程序服务将采用2个Runnables并在池中的两个线程中运行它们。

+0

这是可以的谢谢你。但我也想加载不同的图像到MyDraw()方法中的每个线程。例如robot1 cat.jpg,robot2 dog.jpg.I尝试了不同的东西,他们没有工作。现在我可以加载两个线程相同的图片:( – Ecrin

+0

@ user1073777:将想要加载的图像作为参数传递给构造函数。“Runnable”实际上只关心绘图,而不是它绘制的内容。 – unholysampler

+0

是的,它工作好主意:) – Ecrin