如题,我用用FutureTask来监视一个限时任务,但是捕获不到异常,哪位帮忙分析一下。顺便说一下我的功能:我要实现一个流媒体分发的功能,例如同一路视频要分发给不同的用户,流是通过HTTP方式发给客户端,同一路流的所有请求者放在一个LIST里面,如果不限时,当其中一个用户的网路很差的时候就会将列表中其他的用户也堵住,不符合实时流分发的要求,所以要用FutureTask来控制发送时间,如果有哪位兄弟做过类似的东西也可以给我一些意见
1.这是异常
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at org.mortbay.io.nio.SelectChannelEndPoint.blockWritable(SelectChannelE
ndPoint.java:279)
at org.mortbay.jetty.AbstractGenerator$Output.blockForOutput(AbstractGen
erator.java:544)
at org.mortbay.jetty.AbstractGenerator$Output.flush(AbstractGenerator.ja
va:571)
at org.mortbay.jetty.HttpConnection$Output.flush(HttpConnection.java:101
0)
at com.hisome.web.httpplayer.thread.RealCallable.call(RealCallable.java:
22)
at com.hisome.web.httpplayer.thread.RealCallable.call(RealCallable.java:
13)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.
java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.java:603)
at java.lang.Thread.run(Thread.java:729)
2012-09-21 13:40:14,858 INFO httpplayer.thread.RealCallable -RealCallable write
byte IOException
2.这个是RealCallable的类
public Integer call() throws Exception {
try {
if (res != null && res.getOutputStream() != null) {
res.getOutputStream().write(buffer.array());
res.getOutputStream().flush();
res.flushBuffer();
}
} catch (IOException e) {
if (e instanceof EOFException) {
log.info("RealCallable write byte IOException");
return 1;
}
}
return 0;
}
3.这个是我获取Future的结果的方法体
private void checkTaskResult() {
int res = 0;
String streamId = null;
FutureTask<Integer> future = null;
taskIter = taskMap.entrySet().iterator();
while (taskIter.hasNext()) {
Entry<String, FutureTask<Integer>> ele = taskIter.next();
streamId = ele.getKey();
future = ele.getValue();
try {
res = future.get(10, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
res = 0;
} catch (ExecutionException e) {
res = 0;
} catch (TimeoutException e) {
future.cancel(true);
res = 0;
} catch (CancellationException e) {
res = 0;
}
if (res == 1) {
for (StreamInviter inviter : inviters) {
if (inviter.getStreamId().equals(streamId)) {
inviter.setStatus(false);
}
}
}
}
}
相关推荐
- 如果任务抛出异常,`FutureTask`会捕获这个异常并将其存储,以便在调用`get()`时重新抛出。 4. **示例代码**: ```java ExecutorService executor = Executors.newFixedThreadPool(1); Callable<Integer> ...
如果在任务执行过程中发生异常,`FutureTask`也会捕获并保存这个异常,供后续的`get()`方法抛出。 总结起来,`FutureTask`是Java并发编程中实现异步操作并获取结果的重要工具。它结合了`Runnable`和`Future`接口的...
为了解决这个问题,Java提供了`Callable`接口和`FutureTask`类,它们是实现多线程返回值的关键工具。 `Callable`接口类似于`Runnable`,但比它功能更强大。`Callable`接口中的`call()`方法可以返回一个结果,并且...
6. **异常处理**:异常分类(检查型异常和运行时异常)、捕获与抛出异常、自定义异常、finally块的使用。 7. **IO流**:字节流和字符流的区别,以及FileInputStream、FileOutputStream、BufferedReader、...
对于`ListenableFuture`,你可以注册`FutureCallback`来处理任务完成后的各种情况,如成功时的处理、异常时的捕获或者任务取消的逻辑。 总结一下,`FutureTask`和`ListenableFuture`是Java并发编程中的关键组件,...
- try 块包含可能抛出异常的代码,catch 捕获特定异常,finally 无论是否发生异常都会执行。 - Spring 框架默认仅在遇到 RuntimeException 时回滚事务。 5. **创建线程的几种方式**: - 继承 Thread 类并重写 `...
如果超时,当前线程将恢复执行,并且可以通过调用`interrupt`来中断目标线程(但这并不意味着目标线程会立即停止,它可能需要在内部检查`isInterrupted()`或捕获`InterruptedException`来响应中断)。 在设计多线程...
4. **异常处理机制**:合理设计异常处理逻辑,当接口调用出现异常时能够及时捕获并给出合适的响应。 5. **测试环境验证**:在正式上线前,务必在支付宝提供的测试环境中进行全面的测试,确保接口调用无误。 #### 二...
如果`call()`方法中抛出了异常,`Future.get()`方法也会抛出一个`ExecutionException`,我们需要捕获这个异常来处理任务执行期间的错误。 4. **多结果和FutureTask** 如果你需要从多个Callable任务中获取结果,...
- **异常处理机制**:不同于`Runnable`中的`run()`方法只能捕获或忽略异常,`Callable`的`call()`方法可以通过`throws`关键字声明异常,这使得错误处理更为灵活和清晰。 - **泛型支持**:`Callable<V>`中的`V`表示`...
- 一般异常(如`IOException`)需要被捕获处理。 #### 42. `error`与`exception`的区别 - `error`表示系统级的错误,通常是无法恢复的。 - `exception`表示应用程序级别的异常,可以通过异常处理机制来解决。 ####...
13. **不需查异常的处理**:运行时异常(不需查异常,如`NullPointerException`)可以不被捕获,但良好的编程实践建议总是处理这些异常,尤其是在取消操作中。 14. **JVM关闭**:当JVM退出时,可能有一些线程还在...
当线程池中的线程抛出异常时,如果使用`submit()`,异常会被捕获并封装在`Future`中,而`execute()`则会直接抛出异常。异常线程不会直接影响其他线程,但线程池可能会根据拒绝策略采取相应措施,例如`AbortPolicy`会...
- 异常捕获:如何正确地使用try-catch-finally语句块,以及如何定义和抛出自定义异常。 3. **多线程**: - 线程状态:理解新建、就绪、运行、阻塞和死亡五种线程状态。 - 同步机制:掌握synchronized关键字、...
`Callable`允许抛出异常,这使得在多线程任务中捕获和处理异常成为可能。确保每个线程中的异常都能得到妥善处理,避免影响整个程序的稳定运行。 8. **性能优化**:合理设置线程池参数,根据系统资源和邮件数量调整...
- 一般异常需要被捕获或声明抛出,运行时异常则不需要。 #### 42. `Error`与`Exception`的区别 - `Error`通常表示系统级别的错误,难以恢复。 - `Exception`表示程序错误,可以通过代码处理。 #### 43. 异常处理...
- 自定义异常:何时创建自定义异常,如何抛出和捕获。 4. **多线程** - 线程的创建方式:Thread类、Runnable接口、Callable接口与FutureTask。 - 线程同步:synchronized关键字、volatile关键字、Lock接口(如...
- `try`块用来捕获异常,`catch`块用来处理异常,`finally`块用于释放资源。 #### 44. 常见的`RuntimeException` - `NullPointerException` - `ArrayIndexOutOfBoundsException` - `ArithmeticException` - `...
try 块用于包含可能抛出异常的代码,catch 块用于捕获并处理异常,finally 块用于存放无论是否发生异常都需要执行的代码。throw 用于手动抛出一个异常,而 throws 则用于声明一个方法可能会抛出的异常,让调用者知道...
- 异常处理可以捕获并处理运行时发生的异常,提高程序的健壮性和稳定性。 #### 44. 常见的运行时异常 - `NullPointerException` - `ArrayIndexOutOfBoundsException` - `IllegalArgumentException` - `...