Java: Executor, FutureTask, Unsafe.unpark - как предотвратить printStackTrace?

В Java я использую FutureTask для асинхронного запуска Callable через Executor. Чтобы проверить, произошла ли ошибка в вызывающем потоке, мне нужно сгенерировать потенциальные исключения из Callable. Это, однако, приводит к выводу трассировки стека в System.out (я отлаживал, и это происходит внутри Unsafe.unpark(Thread) из LockSupport.unpark(Thread)).

Любые идеи, как я мог бы предотвратить это?

Я уже регистрировал исключение в реальном регистраторе раньше (через SLF4J) и никогда не хочу прямых трассировок стека в System.out.

Обновление: я думаю, что я уже указал соответствующую информацию, но чтобы уточнить все вопросы: Этот тестовый пример может воспроизвести проблему (Метод testTransferStreamAsyncCallbackFail ()): https://github.com/m-m-m/util/blob/master/io/src/test/java/net/sf/mmm/util/io/base/StreamUtilTest.java

Используемая реализация такова:

public AsyncTransferrer TransferAsync(InputStream inStream, OutputStream outStream, логический keepOutStreamOpen, обратный вызов TransferCallback) {
    StreamTransferrer Transferrer = новый StreamTransferrer(inStream, outStream, keepOutStreamOpen, обратный вызов);
    AsyncTransferrerImpl task = new AsyncTransferrerImpl(Transferrer);
    this.executor.execute(задача);
    возвратное задание;
  }

Я отлаживал код eniter, и это определенно не мой код, который записывается на консоль. Это сделано в JDK, как я пытался объяснить.

Дополнительное обновление, чтобы ответить на вопросы:

Исполнителем, которого я использую, является Executors.defaultThreadFactory(). Как вы можете видеть здесь: https://github.com/m-m-m/util/blob/master/core/src/main/java/net/sf/mmm/util/concurrent/base/SimpleExecutor.java#L30 https://github.com/m-m-m/util/blob/master/io/src/main/java/net/sf/mmm/util/io/base/StreamUtilImpl.java#L165

Вывод - это трассировка стека Исключения, которое я добавляю в своем тесте из Callable:

java.util.concurrent.ExecutionException: net.sf.mmm.util.io.api.RuntimeIoException: IO: при копировании данных произошла необнаруженная ошибка!
23355443-dae9-4f4e-87a2-fe38b8a3d513 в java.util.concurrent.FutureTask.report(FutureTask.java:122) в java.util.concurrent.FutureTask.get(FutureTask.java:192m) в сети.util.io.base.StreamUtilImpl$AsyncTransferrerImpl.get(StreamUtilImpl.java:1) в net.sf.mmm.util.io.base.StreamUtilTest.testTransferStreamAsyncCallbackFail(StreamUtilTest.java:171) в sun.reform Собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.vo.et.reg в org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) в org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) в org.junit.r.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) в org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) в org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) по адресу org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) по адресу org.junit.runners.BlockJUnit4run.runners.ParentRunner$3.run(ParentRunner.java:290) в org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren(ParentRunner.java:28) org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) в org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) в org.junit.runners.ParentRunner.run(ParentRunner.j). 363) в org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) в org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.gava: org38:.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRuntjj).в ternal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) Причина: net.sf.mmm.u. io.api.RuntimeIoException: IO: при копировании данных произошла необнаруженная ошибка!
23355443-dae9-4f4e-87a2-fe38b8a3d513 в net.sf.mmm.util.io.base.StreamUtilImpl$BaseTransferrer.transfer(StreamUtilImpl.java:533) в net.sf.mmm.util.io.base.StreamTtilImp.call(StreamUtilImpl.java:583) в net.sf.mmm.util.io.base.StreamUtilImpl$BaseTransferrer.call(StreamUtilImpl.java:1) в java.util.concurrent.FutureTask.run(FutureTask.java:266).) на java.lang.Thread.run(Thread.java:745) Вызывается: java.io.IOException: Это тест! в net.sf.mmm.util.io.base.StreamUtilTest.testTransferStreamAsyncCallbackFail(StreamUtilTest.java:155) в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.reflect.NativeMethodAmp.Impj в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke(Method.java:498) в org.junit.runners.model.FrameworkMethof: 1. 50) в org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) в org.junit.runners.model.FrameworkMethod.invoke Взрывоопасно (FrameworkMethod.java:47) в org.junit..statements.InvokeMethod.evaluate (InvokeMethod.java:17) в org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:325) в org.junit.runners.BlockJUnit4ClassRunner.runUnit.jun.jj4 () junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:57) в org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) в org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) в org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) в org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) в org.junit.runners.ParentRunner.run(ParentRunner.java:363 в) org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) в org.eclipse.jdt.internal.junit.runner.TestExecution.run (Testececution.java:lip. org) jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:459) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:67t. org или 67). junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:382) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

0 ответов

Другие вопросы по тегам