2012-09-03 129 views
0

我试图在两个三角形点击两次时激活一个三角形。只要我点击它们两次,三角形0开始移动,直到moveX达到20,while(moveX < 20),但它似乎并没有达到终止状态,它不会进入:if(t.getState() == Thread.State.TERMINATED),有什么想法?Java线程并未终止

public class secondFrame extends JFrame implements Runnable { 

} 


public secondFrame(ChallengesDialog dialog) { 

    component = new secFrameDrawComponent(); 
    createComponent(); 

    Thread t = new Thread(this); 
    t.start(); 
} 

private void createComponent() { 

    sGen = new shapeGenerator(434, 231); 

    createT(); 
} 

class AddComponentListener implements MouseListener { 

    public void mouseClicked(MouseEvent event) { 


    for(int i = 0; i < count; i++) { 
     if (component.getTri(i).contains(event.getX(), event.getY())) { 
      component.setShapeFill("triangle", i); 
      component.repaint();  

      countColors(i); 

      setChallenge(); 
     } 
... 
MouseListener listener = new AddComponentListener(); 
component.addMouseListener(listener);      

public void setChallenge() { 

    //two red triangles 
    if(challenge == 1 && triColorCount[1] == 2) { 
     Thread t = new Thread(component); 
     t.start(); 

     System.out.println("Thread's state: " + t.getState()); 

     if(t.getState() == Thread.State.TERMINATED) { 
      //Unreachable 
      System.out.println("Thread completed"); 
     }     
    } 
} 
... 

public void run() { 

    while(threadFlag) { 
     .. 
     timeLabel.setText("Elapsed time: " + elapsedTime); 
     ..      
    } 
} 

public class secFrameDrawComponent extends JComponent implements Runnable { 

    public void modTriangle(int x, int y) { 

     sGen.setTriangleOffset(x, y); 

     triangle[0] = sGen.getTriangle(); 
    } 

    public void paintComponent(Graphics g) { 

     Graphics2D g2 = (Graphics2D)g; 

     draw(g2);  
    } 

    public void run() { 

     while(moveX < 20) { 

      moveX+= 1; 
      modTriangle(moveX, 0); 
      repaint(); 

      try { 
       Thread.sleep(170); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("moveX = " + moveX); 
     } 
     System.out.println("Thread completed exec");   
    } 

    public void draw(Graphics2D g2) { 

     g2.setStroke(new BasicStroke(2)); 

     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 


     modTriangle(moveX, 0); 
     g2.draw(triangle[0]); 
     g2.draw(triangle[1]); 
    } 
+1

线程运行需要多长时间?在检查线程终止之前等待多久? –

+1

最有可能当您检查另一个线程中的终止时,您的任务甚至没有安排。在获得状态之前添加一些睡眠,看看会发生什么。 – zeller

+0

我认为zeller的评论是正确的。 – kosa

回答

1

仔细看看你在做什么。你开始一个新的线程,然后立即检查它是否终止。当然不会,它需要一段时间才能完成动画。如果要等待某个线程完成,请使用join()函数。但请注意,这将阻止调用线程,直到您“加入”的线程完成。

+0

是的,如果另一个线程取决于状态,阻塞应该不成问题。 – zeller

+0

@zeller通常,这是事实。它在GUI应用程序中可能是一种不想要的行为,因为它会阻塞事件处理线程,从而有效地“冻结”接口直到动画线程完成。 – pap

+0

你是对的,那么在这种情况下,用户线程应该轮询任务线程的状态,或者任务应该在主线程完成时通知主线程(但是这有点偏离...) – zeller