3

我可以将一个管道输出流用于多线程并将其连接到一个管道输入流,然后从多线程获取所有输出吗?

以下是代码片段,我想要的是修改和删除线程的输出可用于同步线程,但删除线程的输出丢失了。最后列出 P4Thread 的 run() 方法。

PipedInputStream input = new PipedInputStream();
PipedOutputStream output = new PipedOutputStream();

input.connect(output);

P4Thread syncthread = new P4Thread (new String[]{p4exe, "-x-", "sync", "-f"},input, out);
P4Thread modifythread = new P4Thread (new String[]{p4exe, "diff", "-se"},new ClosedInputStream(), output);
P4Thread deletethread = new P4Thread (new String[]{p4exe, "diff", "-sd"},new ClosedInputStream(), output);  

try {
    syncthread.start();
    modifythread.run();
    output.flush();

    deletethread.run();
    output.flush();
    output.close();

    syncthread .join();
    } catch (InterruptedException e) {
        syncthread .interrupt();
    }

public void run() { 
Launcher.ProcStarter ps = new Launcher.LocalLauncher(listener).launch(); 
ps.envs(env).stdin(input).stdout(output).cmds(cmdList); 
if (workDir != null) { 
    ps.pwd(workDir); 
}
try{
   ps.join();
   }catch (InterruptedException e) {
            if (output != null && closePipes) {
                IOUtils.closeQuietly(output);
            }
            //return -1;
        } catch (IOException e) {
            if (output != null && closePipes) {
                IOUtils.closeQuietly(output);
            }
        } finally {
            if (closePipes) {
                IOUtils.closeQuietly(input);
                IOUtils.closeQuietly(output);
            }
        }
}
4

1 回答 1

2

是的,你可以,只要你注意同步你的多线程写入,这样它们就不会交错。

于 2012-05-22T06:01:33.747 回答