1

在我的代码中,我有一个很长的顺序操作循环。我创建了一个线程来手动停止这个循环。基本上

private static void sendAndCheck() throws InterruptedException {

        stop = false;

        StopChecker r = new StopChecker();
        Thread t = new Thread( r );

        if ( vettore != null ) {
            t.start();
            for ( int i = 0; i < vettore.length; i++ ) {

                do {
                    if ( stop == true ) {
                        break;
                    }

                    //Do something for a lot of time.. (code deleted)

                } while ( !status.equalsIgnoreCase( "PROCESSED" ) ); //<- normal exit 
            }

            //Stop the thread
            stop = true;
        }

    }

并且线程基本上在标准输入上等待停止字符

public class StopChecker implements Runnable {

    public void run() {
        Scanner scanner = new Scanner( System.in );
        System.out.println( "1 - to stop" );
        while ( !Risottometti.stop ) {
            String command = scanner.next();
            if ( command.equalsIgnoreCase( "1" ) ) {
                Risottometti.stop = true;
            }   
            }
        }

    }
}

问题是,如果循环正常退出,线程被锁在scanner.next上,所以下一个输入在仍然死的线程中丢失。如何从主类释放scanner.next?我已经尝试使用 scan.close() 但不起作用...

还有另一种停止循环的方法,而不杀死应用程序?我尝试使用 keyListener,但我有一个空指针

4

3 回答 3

0

请按如下方式更改代码。

1) 用 do - while 块替换 while 循环

2)更改扫描仪代码如下

 do{
    while ( scanner.hasNext() ) {
         String command = scanner.nextLine();
         System.out.println("line:"+command);
    }
 } while ( conditionFlag)

当条件为假时,调用

scanner.close(); 
于 2015-08-26T11:31:05.780 回答
0

您是否尝试过 scan.close() 或scanner.close()?

于 2015-08-26T11:03:20.023 回答
0

这似乎是使用Thread.interrupt是有效场合的情况。处理成功后,执行stopChecker.interrupt- 应该失败Scanner.next并出现ClosedByInterruptException异常。请注意,根据 javadocSystem.in可能会因为此操作而关闭。

如果这不是一个选项,唯一的解决方案是不使用Scanner并以非阻塞方式读取您的选项。

于 2015-08-26T11:03:46.660 回答