0

私は次のコードを書きました。制御が1になったときに、無限ループを停止する必要があります。それ以外の場合は、定期的にSQLデータベースを更新し続けます。ある種の例外が原因でスレッドが終了します。私はそれを理解することができません。誰でもそれを手伝ってくれる?

     public void run()
     {

    while(true)
    {
        System.out.println("I am working t asfbjakhbfjabf");
        synchronized(lock)
        {
            if(control==1)
            {
                return;
            }
        }
        try
        {
            Thread.sleep(wTIME);
            Class.forName(driver).newInstance();
            conn = DriverManager.getConnection(url+dbName,userName,password);
            String st="SELECT count FROM ThreadResults WHERE ThreadNo = "
                                        +t;
            Statement stmt = conn.createStatement();
            stmt.execute(st);
            ResultSet resultSet = stmt.getResultSet();
            boolean b=resultSet.next();
            synchronized(WebCrawler.seed.lock6)
            {
                 float t1=(System.currentTimeMillis()-time)/60000;
                 if(b)
                 {
                    String s2="UPDATE ThreadResults SET count = "+WebCrawler.seed.count+",                      time = "+t1+" WHERE ThreadNo = "+t;
                   System.out.println("updated count");
                   stmt.executeUpdate(s2);
                  }
                 else
                 {
                   String s1="INSERT ThreadResults VALUES("+t+" ,"+WebCrawler.seed.count+" ,"+t1+")";
                    System.out.println("inserting count");
                    stmt.executeUpdate(s1);
                  }
            }
            resultSet.close();
            conn.close();
        }
        catch(InterruptedException | ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException c)
        {
           System.out.println("caught in thread resilt updation "+ c.getMessage());
        }

    }
}
4

2 に答える 2

1

Throwableこれは繰り返されるタスクをスケジュールするための推奨される方法ではありませんが、例外の明示的なリストの代わりにキャッチすることで修正できます。そうすれば、理論的に投げられるものは何でも確実に捕まえることができます。メッセージだけでなく、例外スタックトレース全体を出力してください。

キャッチングを修正するときは、さらにクリーンアップ ロジックを修正する必要があります。closeステートメントをfinally. いっそのこと、Automatic Resource Management を使用するようにコードを書き直してください。構文はtry (Statement stmt = conn.createStatement()) { ... }.

繰り返されるタスクをスケジュールする適切な方法は、Executor を使用することです。

final ScheduledExecutorService sched = Executors.newSingleThreadScheduledExecutor();
sched.scheduleWithFixedDelay(task, 0, wTIME, TimeUnit.MILLISECONDS);
于 2012-10-12T20:09:46.517 に答える
0

あなたは書ける

catch(Exception e) 

あなたが書いたものの代わりに。すべての例外をキャッチします。

于 2012-10-12T20:17:59.547 に答える