使用 PipedOutputStream 时线程竞争条件挂起
Thread race condition just hangs while using PipedOutputStream
我正在使用管道输出流将 OutputStream
转换为 InputStream
,因为 AWS java sdk 不允许使用 OutputStreams
[=14= 将对象放在 S3 上]
我正在使用下面的代码,但是,它会间歇性地挂起。此代码位于 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);
}
}
这会将其转换为不进行复制的输入流。
我正在使用管道输出流将 OutputStream
转换为 InputStream
,因为 AWS java sdk 不允许使用 OutputStreams
[=14= 将对象放在 S3 上]
我正在使用下面的代码,但是,它会间歇性地挂起。此代码位于 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);
}
}
这会将其转换为不进行复制的输入流。