使用多线程

时间:2015-12-02 12:14:13

标签: java multithreading file

有多种方法可以在多线程时将整个控制台输出保存到文件中吗?我正在使用5个线程。我有这个想法,我可以在运行方法中放置一个打印流。

示例:

public void run()  {
 try{
    PrintStream out = new PrintStream(file);
    stopExecute stop = new stopExecute();
    Thread t = new Thread(stop);
    Scanner in = new Scanner(System.in);
    t.start();

        while (!in.hasNextLine()) 
    {
        classThatUsingMultipleThrads();
        System.out.println("Finished");
        anotherClassThatUsingThreads(); 
        System.out.println("Finished"); 
    }
        System.out.prinln("User stopped the execution");
        stop.keepRunning = false;
        System.setOut(out);

       }
    catch(IOException e){System.out.println(e);}

问题在于它只保存输出"用户停止执行"并且whileloop中的所有内容都没有保存。或者来自其他类的输出流。

我试图把

System.setOut(out);

在while循环中,但没有帮助。

编辑:拼写纠正

3 个答案:

答案 0 :(得分:0)

  try {
  System.setOut(new PrintStream(new File("output-file.txt")));
 } 
 catch (Exception e) {
  e.printStackTrace();
 }

感谢:System.out to a file in java

答案 1 :(得分:0)

您应该考虑使用Log4J等日志库。但是你也可以使用像TeeOutputStream这样的东西。这种类型的输出流在调用时写入其他2个流。一些库有很好的实现,但你也可以自己编写一个。我快速地把这个鞭打了。

您可以使用main方法为整个程序设置输出流,以使用此TeePrintStream,然后对System.out.*的所有调用都会将数据写入通常的System.out和你的FileOutputStream

Theres也是TeePrintStream的实现http://www.java2s.com/Code/Java/File-Input-Output/TeePrintStreamteesallPrintStreamoperationsintoafileratherliketheUNIXtee1command.htm

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

public class SO34042494 {
    public static void main(String[] args) throws FileNotFoundException {
        System.setOut(new TeePrintStream(System.out, new FileOutputStream(new File("x:\\output.txt"))));

        System.out.println("Check check");
        System.out.println("1");
        System.out.println(2);
        System.out.println(3L);
    }

    public static class TeePrintStream extends PrintStream {
        private final OutputStream tee;

        public TeePrintStream(PrintStream original, OutputStream tee) {
            super(original);
            this.tee = tee;
        }

        @Override
        public void write(byte[] b) throws IOException {
            super.write(b);
            tee.write(b);
        }

        @Override
        public void write(byte[] buf, int off, int len) {
            super.write(buf, off, len);
            try {
                tee.write(buf, off, len);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        @Override
        public void write(int b) {
            super.write(b);
            try {
                tee.write(b);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        @Override
        public synchronized void close() {
            try {
                tee.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                super.close();
            }
        }
    }
}

我在这里的TeePrintStream是我刚刚聚集在一起的,如果您要在生产项目中使用它,请将其打磨并彻底测试

答案 2 :(得分:0)

Okej我想我解决了它。在我的主要内容我就是这样:

public static void main(String[] args) {
Prinstream out = new Prinststream(file);

/*   
   Do some things like start threads, call objects etc..
   .
   .
   .
   .
*/
  System.setOut(out);

我认为当所有线程都启动并执行它们时(我确实为每个线程分配了一个对象),printstream将捕获其他类中发生的每个控制台输出。 在我编辑stopExecute类之前,这没有用。

public class stopExecute implements Runnable {
  Scanner scan = new Scanner(System.in);    
  private Object[] obj;

public stopExecute(Object[] obj)
{
    this.obj = obj;
}

public void run() {
    while(true){
        stop();
    }
}
public void stop() {
    if(scan.hasNextLine()){
        System.out.println("Stopped");
        System.exit(0); 
    }
  }
}

谢谢你的帮助。我会调查你的建议并试一试。在此解决方案中,我无法使用Log4J。但我肯定会检查出来。