Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程不终止_Java_Multithreading_Runnable_Implements - Fatal编程技术网

Java线程不终止

Java线程不终止,java,multithreading,runnable,implements,Java,Multithreading,Runnable,Implements,当两个三角形被单击两次时,我尝试设置三角形的动画。只要我点击它们两次,三角形0开始移动,直到moveX达到20,而(moveX

当两个三角形被单击两次时,我尝试设置三角形的动画。只要我点击它们两次,三角形0开始移动,直到moveX达到20,而(moveX<20),但它似乎没有达到终止状态,它不会进入内部:如果(t.getState()==Thread.state.terminated),有什么想法吗

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]);
    }
公共类secondFrame扩展JFrame实现可运行{
}
公共第二帧(ChallengesDialog对话框){
component=新的secFrameDrawComponent();
createComponent();
螺纹t=新螺纹(此);
t、 start();
}
私有void createComponent(){
sGen=新形状发电机(434231);
createT();
}
类AddComponentListener实现MouseListener{
公共void mouseClicked(MouseEvent事件){
for(int i=0;i
仔细查看您正在执行的操作。您启动一个新线程,然后立即检查它是否终止。当然不会终止,它需要一段时间才能完成动画。如果您想等待线程完成,请使用该函数。但是,请注意,这将阻止调用线程,直到您创建的线程结束“加入”已完成。

线程运行需要多长时间?在检查线程是否已终止之前,您需要等待多长时间?最有可能的情况是,当您在另一个线程中检查终止时,您的任务甚至没有计划。在获取状态之前添加一些睡眠,看看会发生什么。我认为zeller的评论是正确的。如果我添加System.out.println(“线程状态:+t.getState());尝试{t.sleep(5000);}catch(InterruptedException e){e.printStackTrace();}它达到终止状态,但动画未终止shown@user1420482这是有意义的,因为你一直在等待线程完成,但是你已经阻止了GUI线程,所以你看不到任何更新。是的,如果另一个线程依赖于状态,那么不应该阻止这是一个问题。@zeller通常是这样。但在GUI应用程序中,这可能是一个不需要的行为,因为它会阻塞事件处理线程,实际上是“冻结”直到动画线程完成为止。没错,在这种情况下,用户线程应该轮询任务线程的状态,或者任务应该在完成时通知主线程(但这有点离题…)是否有一种在动画线程.sleep(millis)或.join()时不“冻结”接口的解决方法?@user1420482是的。不要等待动画完成,让它按原样运行。