2016-08-12 49 views
0

項目源代碼具有用於SQL處理的Java方法。該方法確實有效,但它使用了一個有問題的解決方法:try-catch在正常執行的方法的最後部分阻塞。什麼是實施它的正確方法?在該方法中嘗試捕獲//這是一種解決方法。它應該如何重新修復?

public void run() { 
     if (running) { 
      return; 
     } 
     running = true;    
     while(null == Common.server || null == Common.database || !ConnectionsPool.isInitialized()) { 
      // Wait until the database is set before continuing... 
      try { 
       Thread.sleep(1000); 
      } 
      catch(Exception ex) {} 
     } 
     while(running) { 
      final Connections cs = ConnectionsPool.getConnections(); 
      Connection c = null; 
      while(!entries.isEmpty()) { 
       if (null == c) { 
        c = cs.getConnection(); 
       } 
       SQLLogEntry entry = entries.remove(); 
       if (null != entry) { 
        try { 
         write(entry, c); //find usages 
        } 
        catch (SQLException ex) { 
         writeLogFile("Could not write entry to SQL", ex); 
        } 
       } 
      } 
      if (null != c) { 
       try { 
        c.commit(); 
       } 
       catch (SQLException ex) { 
        writeLogFile("Could commit to SQL", ex); 
        try { 
         c.rollback(); 
        } 
        catch (SQLException ex1) { 
        } 

        // log 
        final StringWriter err = new StringWriter();       
        ex.printStackTrace(new PrintWriter(err)); 
        EditorTransactionUtil.writeLogFile(err.toString());       
        // for user 
        final String msg = "Exception: " + EditorUtil.getErrorMessage(ex.getMessage());       
        try { 
         SwingUtilities.invokeAndWait(() -> { 
          JOptionPane.showMessageDialog(null, msg); 
         }); 
        } 
        catch (Throwable ex1) { 
        } 
       } 
       finally { 
        cs.returnConnection(c); 
       } 
       c = null; 
      } 

      synchronized(entries) { 
       try { 
        entries.wait(1000); 
       } 
       catch (InterruptedException ex) { 
        // This is a workaround to process this loop... 
       } 
      } 
     } 
     writeLogFile("SQLMsgLogger run loop stopping..."); 
    } 
+0

你試試catch塊你的意思是?其中有很多...也可能是StackOverflow不是要求代碼推薦/審查的最佳社區。 – n247s

+0

其他'entries'可能被重新分配/調用'entries.notify()'或類似的,同步的。我不知道'entries'是什麼,但是應該使用一些併發能力的隊列。整個同步塊應該消失。 –

+0

這一個:'catch(InterruptedException ex){//這是一個解決方法來處理這個循環...}' – sixtytrees

回答

1

此代碼的問題從這裏開始。

If(running) return; 
running=true; 

這顯然是試圖確保只有一個線程執行。這是檢查併發性的錯誤方法。當if檢查結束時,第二步可能會啓動,但分配尚未開始。你需要使用syncronizible接口。

至於配置的try catch塊 - 正如Konrad指出的那樣,如果沒有Thread.interrupt()調用,它將不會執行。它可能是以前版本遺留的死代碼。

相關問題