传统程序有一个单独的线程执行,包含该程序的语句或指令顺序执行直到程序终止。
一个多线程的程序有多个线程的执行。在每个线程是按顺序执行的,但是在多核CPU机器上线程可能并行地执行。例如,通常情况下在单一CPU的机器,多个线程实际上不是并行执行的,而是模拟并行交叉的线程的执行。
Ruby的可以使用 Thread 类很容易地编写多线程程序。 Ruby线程是一个轻量级的和高效的在代码中实现并行性。
创建Ruby线程:
要启动一个新线程,关联一个块通过调用Thread.new。将创建一个新的线程执行的代码块,原始线程将立即从Thread.new返回并继续执行下一个语句:
# Thread #1 is running hereThread.new { # Thread #2 runs this code}# Thread #1 runs this code
例如:
这里是一个例子说明,我们如何能够利用多线程的Ruby的程序。
#!/usr/bin/rubydef func1 i=0 while i<=2 puts "func1 at: #{Time.now}" sleep(2) i=i+1 endenddef func2 j=0 while j<=2 puts "func2 at: #{Time.now}" sleep(1) j=j+1 endendputs "Started At #{Time.now}"t1=Thread.new{func1()}t2=Thread.new{func2()}t1.joint2.joinputs "End at #{Time.now}"
这将产生以下结果:
Started At Wed May 14 08:21:54 -0700 2008func1 at: Wed May 14 08:21:54 -0700 2008func2 at: Wed May 14 08:21:54 -0700 2008func2 at: Wed May 14 08:21:55 -0700 2008func1 at: Wed May 14 08:21:56 -0700 2008func2 at: Wed May 14 08:21:56 -0700 2008func1 at: Wed May 14 08:21:58 -0700 2008End at Wed May 14 08:22:00 -0700 2008
线程的生命周期:
创建一个新的线程用 Thread.new。也可以使用了同义词用 Thread.Start 和 Thread.fork。
没有必要启动一个线程在它被创建后,它会自动开始运行时,CPU 资源成为可用。
Thread 类定义了一些方法来查询和处理的线程在运行时。运行一个线程块中的代码调用Thread.new,然后它停止运行。
该块中的最后一个表达式的值是线程的值,可以通过调用 Thread对象值的方法。如果线程运行完成,则该值为线程的返回值。否则,该值方法会阻塞不会返回,直到该线程已完成。
类方法Thread.current返回代表当前线程的 Thread对象。这允许线程操纵自己。类方法 Thread.main返回线程对象代表主线程,thread.this初始线程开始执行Ruby程序开始时。
可以等待一个特定的线程通过调用该线程的Thread.Join方法来完成。调用线程将被阻塞,直到给定线程完成。
线程和异常:
如果在主线程中引发一个异常,并没有任何地方处理,Ruby解释器打印一条消息并退出。在主线程以外的其他线程,未处理的异常导致线程停止运行。
如果线程 t 退出,因为未处理的异常,而另一个线程调用t.join或t.value,那么所发生的异常在 t 中提出的线程 s。
新闻热点
疑难解答