2017-02-19 22 views
0

Я не знаю, как печатать в текстовом файле, когда я использую потоки, потому что каждый раз, когда он просто создает другой файл, я получаю только один результат, который является последним, я пробовал много вещей и всегда одно и то же.Как печатать в текстовом файле, если я использую потоки в java?

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

public class Adsda implements Runnable{ 
    private int id=0; 
    public int number; 
    public String file="Time.txt"; 
    private final PrintWriter outputStream; 

    public Adsda(int id) throws FileNotFoundException { 
     this.id=id+1; 
     this.outputStream=new PrintWriter(this.file); 
    } 

    public void run() { 
     int i,fact=1; 
     this.number=id;//It is the number to calculate factorial  
     long A=System.nanoTime(); 
     for(i=1;i<=this.number;i++){  
      fact=fact*i;  
     } 
     long B=System.nanoTime(); 
     long t=B-A; 
     double tt = (double)t/1000000000.0; 
     System.out.println("Factorial of "+number+" is: "+fact+" Time: "+tt); 
     this.outputStream.println("Factorial of: "+this.number+" Time: "+tt); 
     this.outputStream.flush(); 
    } 

    public static void main(String[] args) throws FileNotFoundException{ 
     ExecutorService executor = Executors.newFixedThreadPool(2);//creating a pool of 2 threads 

     for(int i=0;i<5;i++){ 
      executor.submit(new Adsda(i)); 
     } 

     executor.shutdown(); 
    } 

ответ

0

Вы должны создать единый PrintWriter и поделиться тем, что с нитями, передав его в конструктор вместо того, чтобы каждый поток создать свой собственный PrintWriter (и файл). Хотя это приведет к тому, что файл, содержащий результаты в странном порядке. Если вы хотите, чтобы они были в определенном порядке, вы должны иметь, чтобы потоки выводили свои результаты в свои собственные буферы, и когда все потоки завершены, последовательно записывайте буферы в файл.

PrintWriter pw = new PrintWriter(filename); 

for(int i=0;i<5;i++){ 
    executor.submit(new Adsda(i, pw)); 
} 
0

Просто, чтобы ответить на ваш вопрос, у вас есть несколько потоков, которые выполняют свой метод запуска и все они будут писать в файл с именем «time.txt». Вы должны написать файл для каждого потока. Также вы делитесь своим потоком вывода между несколькими потоками, что само по себе является проблемой. Переместите создатель записи в методе запуска и используйте имя типа «время» + Thread.curentThread(). GetID() + «.txt». Это должно исправить это.