[NAME]
ALL.dao.concurrent.threading

[TITLE]
多线程模块

[DESCRIPTION]

多线程模块mt提供了创建轻任务的方法 和自动并行化的方法来自动并行一些常见的使用标准容器类型
的计算。

 0.1   创建轻任务  

创建轻任务的最简单的方法是使用函数式方法mt.start 来运行一个表达式或代码块: 
     
   1  var a = 123
   2  var fut = mt.start { a*a }
   3  var fut2 = mt.start {
   4      for(var i = 1 : 1000 ) b = a*a
   5  }
     
这个函数式方法是以代码块方法(类似Ruby里的Code Block)的形式实现, 它能使用一个调用时附加的代
码块作为隐式参数。 mt.start将创建的轻任务以未来值的形式返回。 这个轻任务可能会从线程池里重用
一个已创建的系统线程, 或创建一个新的系统线程来运行该任务。

 0.2   未来值  

未来值是一个表示未确定值的类型,它通常用来表示一个轻任务的结果。 在该轻任务正常结束之前,未来
值的值始终是未确定的。 这种未来值可用来对轻任务做简单的调度。 它可以用来无限时或限时阻塞当前
轻任务以等待它所表示的轻任务的结束。 例如: 
     
   1  fut.wait()
   2  fut2.wait( 0.1 )
     
未来值所表示的轻任务的的结果可由下面的方法获得: 
     
   1  var value = fut.value()
     
这个方法将无限时阻塞当前轻任务以等待它所表示的轻任务的结束.

 0.3   并行代码块方法  

最简单的并行编程方式是,使用多线程模块mt的并行代码块方法。 下面是mt所支持的并行代码块方法: 

  *  iterate():
     并行迭代预先定义的次数以执行它的调用所带的代码块预先定义的次数;  或并行历遍列表,关联
     表或数组并对每个元素执行它所带的代码块; 
  *  map()
     并行映射一列表,关联表或数组到一由它所带代码块的执行结果组成的新的列表,关联表或数组; 

  *  apply()
     并行地历遍列表,关联表或数组的每个元素,并使用代码块的执行结果替换该元素的原有值; 
  *  find()
     在列表,关联表或数组上并行查找满足代码块所表示的条件的元素,  并返回第一个满足条件的元
     素。 

Examples, 
     
   1  mt.iterate( 10 ) { io.writeln( X ) }
   2  mt.iterate( {1,2,3,4,5,6}, 3 ) { io.writeln( X ) }
     


 0.4   其它方法  

mt还支持少数其他方法: 
  *  select( group: list<@T>, timeout = -1.0 ) => tuple<selected: none|@T, value: any, 
     status: enum<selected,timeout,finished>>
     从一组管道或未来值中选择来获得最新可用的管道或未来值。它支持一个等待超时时间。 它可返回
     一个带以下可能值的元组:  -- (Channel|Future, data, $selected);  -- (none, none, $tim
     eout);  -- (none, none, $finished);