2011-12-22 2 views
4

вот код, который я использовал для
Удаление и переименование большого количества файлов внутри каталога.Как предотвратить использование статических методов несколькими сервлетными потоками сразу

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
    response.setContentType("text/html; charset=UTF-8"); 
    response.setCharacterEncoding("UTF-8"); 
    RootSipResourceApp.updateRootFile(strDirectorypath, strappID, appNames); 
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/index.jsp"); 
    dispatcher.forward(request, response); 
} 

public static void updateRootFile(String directorypath, String appID, String[] appName) 
    throws IOException { 
    try { 
     FileInputStream fin = null; 
     File[] listOfFiles=fileLists(directorypath); 
     for (int i = 0; i < listOfFiles.length; i++) { 
      if (listOfFiles[i].isFile()) { 
       rootFiles = listOfFiles[i].getName(); 
       if (rootFiles.endsWith(".properties") || rootFiles.endsWith(".PROPERTIES")) { 
        fin = new FileInputStream(directorypath + rootFiles); 
        properties.load(new InputStreamReader(fin, Charset.forName("UTF-8"))); 
        String getAppName = properties.getProperty("root.label." + appID); 
        String propertyStr = "root.label." + appID; 
        saveFile(fin, getAppName, directorypath + rootFiles, propertyStr, appName[i]); 
       } 
      } 
     } 
    } catch (Exception e) { 
     System.out.println("expn-" + e); 
    } 
} 

public static void saveFile(FileInputStream fins, String oldAppName, String filePath, String propertyStr, String appName) 
    throws IOException { 
    String oldChar = propertyStr + "=" + oldAppName; 
    String newChar = propertyStr + "=" + appName; 
    String strLine; 
    File f1 = new File(filePath); 
    File f2 = new File("C:\\Equinox\\RootSipResource\\root\\root_created.properties"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f1), "UTF-8")); 
    OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(f2), "UTF-8"); 
    while ((strLine = br.readLine()) != null) { 
     strLine = strLine.replace(oldChar, newChar); 
     out.write(strLine); 
     out.write("\r\n"); 
    } 
    out.flush(); 
    out.close(); 
    br.close(); 
    fins.close(); 
} 
+0

Я не знаю, где вопрос и код сходится, но вы можете использовать синхронизированные блоки, где бы вы ни хотели предотвратить многопоточную хаос :-) – aishwarya

ответ

7

Вариант 1:

изменение public static void updateRootFile в public static synchronized void updateRootFile

Вариант 2:

Добавить пользователя в класс сервлета

private final static Object lock = new Object(); 

затем обернуть код внутри обновлениеRootFi Метод ле в

Разница заключается в том, что вариант 1 замки весь сервлет класс (все его синхронизированные методы) в то время как вариант 2 позволяют вызова методов других сервлета из других нитей, кроме updateRootFile()

я считаю, один из самых окончательного руководства is here. Главы 07 - 11 относятся к многопоточному коду.

+0

Вопрос для интервью;)? – andrey

+0

Спасибо Аарон! Таким образом, он выглядит лучше. – andrey

+1

Могу ли я написать эту синхронизацию (блокировку) { .... } внутри doPost .i прошипел таким образом, но все же он не работает public void doPost (запрос HttpServletRequest, ответ HttpServletResponse) throws ServletException, IOException {synchronized (lock) { \t \t \t RootSipResourceApp.updateRootFile (strDirectorypath, strappID, appNames); \t \t \t System.out.println ("after ................"); }} – chinchu

3

Вы можете использовать synchronized способ для этого. Вы можете прочитать об этом here

public synchronized static void updateRootFile 
Смежные вопросы