我正在编写一种从 Amazon s3 存储桶放置/获取文件的基本方法。这是我方法中的相关代码。“key”是 S3 名称,“saveStream”是 InputStream
Upload myUpload = transferManager.upload(daqBucketName, key, saveStream, metadata);
try {
myUpload.waitForCompletion();
saveStream.close();
} catch (InterruptedException e) {
key = null;
e.printStackTrace();
} catch (AmazonServiceException e) {
key = null;
e.printStackTrace();
} catch (AmazonClientException e) {
key = null;
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if (saveStream != null) {
try {
saveStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return key;
}
流上传成功,但有一个线程阻止程序完成(让程序运行)。任何想法出了什么问题?这是 jstack 转储:
"Attach Listener" daemon prio=10 tid=0x6a403c00 nid=0x2019 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"DestroyJavaVM" prio=10 tid=0xb6609400 nid=0x1b51 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"s3-transfer-manager-worker-1" prio=10 tid=0x695d1800 nid=0x1b5f waiting on condition [0x68efe000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x9f3a2178> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:386)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:679)
"java-sdk-http-connection-reaper" daemon prio=10 tid=0x69551800 nid=0x1b5e waiting on condition [0x69292000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.amazonaws.http.IdleConnectionReaper.run(IdleConnectionReaper.java:75)
"Low Memory Detector" daemon prio=10 tid=0xb66cb000 nid=0x1b5c runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread1" daemon prio=10 tid=0xb66c9400 nid=0x1b5b waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" daemon prio=10 tid=0xb66c7400 nid=0x1b5a waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=10 tid=0xb66c6000 nid=0x1b59 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=10 tid=0xb66b6400 nid=0x1b58 in Object.wait() [0x6ae7d000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x9f2a02c0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:133)
- locked <0x9f2a02c0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:149)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177)
"Reference Handler" daemon prio=10 tid=0xb66b4c00 nid=0x1b57 in Object.wait() [0x6a7eb000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x9f2a4038> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x9f2a4038> (a java.lang.ref.Reference$Lock)
"VM Thread" prio=10 tid=0xb66b1000 nid=0x1b56 runnable
"GC task thread#0 (ParallelGC)" prio=10 tid=0xb6610800 nid=0x1b52 runnable
"GC task thread#1 (ParallelGC)" prio=10 tid=0xb6611c00 nid=0x1b53 runnable
"GC task thread#2 (ParallelGC)" prio=10 tid=0xb6613400 nid=0x1b54 runnable
"GC task thread#3 (ParallelGC)" prio=10 tid=0xb6614c00 nid=0x1b55 runnable
"VM Periodic Task Thread" prio=10 tid=0xb66cd400 nid=0x1b5d waiting on condition
JNI global references: 1641