以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 Java/Eclipse 』  (http://bbs.xml.org.cn/list.asp?boardid=41)
----  java并发研读笔记(二)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=41&rootid=&id=24848)


--  作者:杨一
--  发布时间:11/30/2005 5:27:00 PM

--  java并发研读笔记(二)
rejectedExecution定义了当 execute 不能接受某个任务时,可以由 ThreadPoolExecutor 调用的方法。因为超出其界限而没有更多可用的线程或队列槽时,或者关闭 Executor 时就可能发生这种情况。 在没有其他替代方法的情况下,该方法可能抛出未经检查的 RejectedExecutionException,而该异常将传播到 execute 的调用方。
   它是作为executor的一个参数出现的
   defaultThreadFactory返回用于创建新线程的默认线程工厂。此工厂创建同一 ThreadGroup 中 Executor 使用的所有新线程。如果有 SecurityManager,则它使用 System.getSecurityManager() 组来调用defaultThreadFactory 方法,其他情况则使用线程组。每个新线程都作为非守护程序而创建,并且具有 Thread.NORM_PRIORITY 优先级。新线程具有可通过pool-N-thread-M 的 Thread.getName() 来访问的名称,其中 N 是此工厂的序列号,M 是此工厂所创建线程的序列号。
   它也是作为executor的一个参数出现的
   Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。计算完成后只能使用 get 方法来检索结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为基础任务的结果。

下面两行是我在源代码中找出的结构:
public interface RunnableFuture extends Runnable, Future
public class FutureTask implements RunnableFuture
可见FutureTask本身就是Runnable的,可以作为executor执行的参数,并期待它的返回值。
那么Runnable和Callable又是什么关系呢?
在javadoc中是这样描述的:
Callable<V>返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。
Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。
在源代码中Callable接口定义如下:
public interface Callable {  
  Object call() throws Exception;
}
可见,该接口具备了返回对象的能力,却不具备Runnable的能力。
设计者通过在FutureTask构造方法中定义Callable,使得实现了Runnable的future具备了return Object的能力
一个便于理解的实例如下所示:
     FutureTask<String> future =
       new FutureTask<String>(new Callable<String>() {
         public String call() {
           return searcher.search(target);
       }});
     executor.execute(future);


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
35.156ms