可重复的线程启动

时间:2013-07-21 19:36:16

标签: java multithreading swing user-interface

此代码包含可移动的pacman,按下空格键后射出小椭圆。默认情况下布尔变量为false。按空格键后变为真,并绘制椭圆。按空格键后,也启动新线程。这个线程包含向前移动椭圆的代码,一旦它到达某些coords就消失了。所以当我第一次按空格时,一切正常。实际上它也可以工作多次,但是elclipse不断抛出IllegalThreadStateException。我决定放线程代码进入while(c!=22)块,因为当c = 21时球消失,所以我认为线程将保持可运行,因为条件无法满足。所以我的观点是每次按空格按钮都会使椭圆运动。< strong>这不是完整的代码。只是重要的一部分。如果您需要完整的代码,请告诉我。谢谢!

主题:

        thread=new Thread(){
        public void run(){
            while(c!=22){
            try{
            for (c=0;c<=20;c++){
                newX=newX+c;
                repaint=true;
                Thread.sleep(100);  
                }
            if(c==21){
                shoot=false;
                c=0;
            }
        }catch(InterruptedException v){System.out.println(v);}
        }
        }
    };

paintComponent方法:

    public void paintComponent(Graphics g){
    super.paintComponent(g);

    i=new ImageIcon("C:\\Users\\Jakub\\Desktop\\pm.gif");
    pacman=i.getImage();

    g.drawImage(pacman,x,y,this);

    if(!shoot)
        newX=x+20;
        newY=y+10;

    if(shoot){
    g.drawOval(newX,newY,10,10);
    }

    if(repaint)
        repaint();

}

启动线程的关键事件:

if(e.getKeyCode()==KeyEvent.VK_SPACE){
    shoot=true;
    thread.start();
}

1 个答案:

答案 0 :(得分:5)

可能会抛出

IllegalThreadStateException,因为您为同一个线程对象多次调用Thread.start()。避免此异常的关键是每次启动它时实例化thread(确切的实现取决于您想要实现的行为)。