gpt4 book ai didi

java - 使用 PipedOutputStream 时线程竞争条件挂起

转载 作者:行者123 更新时间:2023-11-30 08:32:06 27 4
gpt4 key购买 nike

我正在使用管道输出流将 OutputStream 转换为 InputStream 因为 AWS java sdk 不允许使用 OutputStreams

我正在使用下面的代码,但是,这会间歇性地挂起。此代码位于 Web 应用程序中。目前应用程序没有负载...我只是在我的个人计算机上试用它。

ByteArrayOutputStream os = new ByteArrayOutputStream();
PipedInputStream inpipe = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(inpipe);
try {
String xmpXml = "<dc:description>somedesc</dc:description>"
JpegXmpRewriter rewriter = new JpegXmpRewriter();
rewriter.updateXmpXml(isNew1,os, xmpXml);
new Thread(new Runnable() {
public void run () {
try {
// write the original OutputStream to the PipedOutputStream
println "starting writeto"
os.writeTo(out);
out.close();
println "ending writeto"
} catch (IOException e) {
System.out.println("Some exception)
}
}
}).start();
ObjectMetadata metadata1 = new ObjectMetadata();
metadata1.setContentLength(os.size());
client.putObject(new PutObjectRequest("test-bucket", "167_sample.jpg", inpipe, metadata1));
}
catch (Exception e) {
System.out.println("Some exception")
}
finally {
isNew1.close()
os.close()
}

最佳答案

与其为启动另一个线程、实例化两个并发类、然后将数据从一个线程传递到另一个线程的复杂性烦恼,而不是解决所提供的 JDK API 中的一个小限制,您应该只创建一个简单的特化ByteArrayOutputStream:

class BetterByteArrayOutputStream extends ByteArrayOutputStream {
public ByteArrayInputStream toInputStream() {
return new ByteArrayInputStream(buf, 0, count);
}
}

这会将其转换为不进行复制的输入流。

关于java - 使用 PipedOutputStream 时线程竞争条件挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40286626/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com