清除扫描仪(中)

时间:2015-08-26 10:21:42

标签: java multithreading java.util.scanner system.in

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

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,但我有一个空指针

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这似乎是使用echo customTime($rowHomeTop["DandTStory"]); 是有效场合的情况。处理成功后,执行Thread.interrupt - stopChecker.interrupt会因Scanner.next例外而失败。请注意,根据javadoc ClosedByInterruptException可能因此操作而被关闭。

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

答案 2 :(得分:0)

请按以下方式更改代码。

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

2)更改扫描程序代码如下

scanner.close(); 

当条件为假时,请致电

require_once('html2pdf.class.php');
$results = mysql_query("SELECT * FROM tbl ORDER BY id DESC LIMIT 10");
while ($row = mysql_fetch_assoc($results)) { 
$id=$row['id'];
       include('pdf.php');
        $content = ob_get_clean();
        try
        {
    $html2pdf = new HTML2PDF('P', 'A4', 'en', false, 'ISO-8859-1'); 
    $html2pdf->setTestTdInOnePage(false);

    $html2pdf->writeHTML($content, isset($_GET['vuehtml']));
            $Filename = "PDF_".$id.".pdf";
            $html2pdf->Output($Filename, 'F');
        }
        catch(HTML2PDF_exception $e) {
            echo $e;
            exit;
        }
      }