Java scrive su file di testo da più thread

0

Ho una discussione che legge e inserisce nuove righe nello stesso file. Devo sincronizzare quel file in modo che nessun altro thread non stia accedendo al file nello stesso momento. Ecco come sincronizzerò un record di file perché mentre scrivono altri thread. Quale approccio usare in questo caso?

ReentrantLock

o

producer-consumer pattern

Il mio codice di esempio

public class ThreadManager extends Thread {

    public void run() {
        try {
            BufferedReader br = null;
            String line;
            String fileNme = "threadLog.txt";
            ArrayList<String> fileLines = new ArrayList<String>();
            int numLine = 0;

            File outFile = new File("$$$$$$$$.tmp");

            // input
            FileInputStream fis = null;
            PrintWriter out = null;

   //From here is a critical section

                fis = new FileInputStream(fileNme);


            // output
                FileOutputStream fos = new FileOutputStream(outFile);
                out = new PrintWriter(fos);
            BufferedReader in = new BufferedReader(new InputStreamReader(fis));

            try {
                while ((line = in.readLine()) != null) {
                    fileLines.add(line);
                }
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            if (!fileLines.isEmpty()) {
                int middleLine = (int) Math.round(fileLines.size() / 2);
                fileLines.add(middleLine, Thread.currentThread().getName());

                for (int i = 0; i < fileLines.size(); i++) {
                    out.println(fileLines.get(i));
                }

                out.flush();
                out.close();
                try {
                    in.close();
                    new File(fileNme).delete();
                    outFile.renameTo(new File(fileNme));
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

//end critical section
      }
    
posta Fortran 28.02.2015 - 16:46
fonte

0 risposte

Leggi altre domande sui tag