print format
で、このように正しくないフォーマットを書いて実行すると、UnknownFormatConversionException
がスローされます。
System.out.printf("%.f%n", 1.23f); // => Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = '.'
Concurrency Utilities APIのスレッドプールを使った場合、スケジュールでないスレッドプールで以下のようにしても、同様に例外がスローされます。
スレッドのところが、"pool-1-thread-1"
になりますが、main
スレッドのときと同じエラーになります。
lang
1Executors.newFixedThreadPool(1).execute(() -> { 2 System.out.println("thread: " + Thread.currentThread()); 3 System.out.printf("%.f%n", 1.23f); 4}); 5 6Executors.newCachedThreadPool().execute(() -> { 7 System.out.println("thread: " + Thread.currentThread()); 8 System.out.printf("%.f%n", 1.23f); 9});
ところが、Executors.newScheduledThreadPool(1)
で同じことをしようとすると、処理がブロックされてしまいます。
execute
メソッドでなくて、scheduleAtXXX
メソッドでも同様です。
lang
1Executors.newScheduledThreadPool(1).execute(() -> { 2 System.out.println("thread: " + Thread.currentThread()); 3 System.out.printf("%.f%n", 1.23f); 4});
"pool-1-thread-1"
のスタックトレースを見てみると、LockSupport
のpark
でブロックされているようです。
sun.misc.Unsafe.park(Native Method) java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
これって、バグでしょうか?
実行環境は、Java 8 u66で、Mac 10.11.2 と Windows 7 professional 64bit のどちらでも再現しました。
よろしくお願いします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/23 14:08
2015/12/23 15:03 編集
退会済みユーザー
2015/12/23 16:51 編集
2015/12/24 02:21