线程是一系列指令,可以(可能)并行于其他指令运行。类 Thread
提供了对底层虚拟机(反过来可能或可能不是操作系统线程)提供的线程的一些抽象。
由于线程是相当底层的,因此大多数应用程序应该使用其他基元,如 start
,它也并行运行并返回 Promise
。
my = (^10).map:.finish for ;
当前线程在动态变量 $*THREAD
中可用。
方法§
方法 new§
method new(:!, Bool : = False, Str : = '<anon>' --> Thread)
创建并返回一个新的 Thread
,而不启动它。&code
是将在单独线程中运行的代码。
$name
是一个用户指定的字符串,用于标识线程。
如果 $app_lifetime
设置为 True
,则当进程的主线程终止时,线程将被终止。如果设置为 False
,则只有当线程完成时,进程才会终止。
方法 start§
method start(Thread: , Bool : = False, Str : = '<anon>' --> Thread)
创建、运行并返回一个新的 Thread
。请注意,它可以在线程的代码完成运行之前返回(并且通常会返回)。
方法 run§
method run(Thread:)
运行线程,并返回调用者。运行已启动的线程是一个错误。
方法 id§
method id(Thread: --> Int)
返回一个数字,唯一的线程标识符。
方法 finish§
method finish(Thread:)
等待线程完成。在其他编程系统中,这称为 join。
方法 join§
method join(Thread:)
等待线程完成。
方法 yield§
method yield(Thread:)
告诉调度程序现在更喜欢另一个线程。
Thread.yield;
方法 app_lifetime§
method app_lifetime(Thread: --> Bool)
返回 False
,除非在对象创建期间将命名参数 :app_lifetime
特别设置为 True
。如果该方法返回 False
,则表示只有当线程完成时,进程才会终止,而 True
表示当进程的主线程终止时,线程将被终止。
my = Thread.new(code => );my = Thread.new(code => , :app_lifetime);say .app_lifetime; # OUTPUT: «False»say .app_lifetime; # OUTPUT: «True»
方法名称§
method name(Thread: --> Str)
返回用户定义的字符串,该字符串可以在对象创建期间选择性地设置,以识别Thread
,如果未指定此类字符串,则返回'<anon>'
。
my = Thread.new(code => );my = Thread.new(code => , name => 'my thread');say .name; # OUTPUT: «<anon>»say .name; # OUTPUT: «my thread»
方法 Numeric§
method Numeric(Thread: --> Int)
返回一个数字,唯一的线程标识符,即与id相同。
方法 Str§
method Str(Thread: --> Str)
my = Thread.new(code => , name => 'calc thread');say .Str; # OUTPUT: «Thread<3>(calc thread)»
方法 is-initial-thread§
method is-initial-thread(--> Bool)
返回一个布尔值,指示当前线程(如果作为类方法调用)或调用它的 Thread 对象是否是程序启动时的初始线程。
say Thread.is-initial-thread; # True if this is the initial threadsay .is-initial-thread; # True if $*THREAD is the initial thread
请注意,不能保证这实际上是从操作系统的角度来看的主线程。另请注意,如果您需要这方面的内容,除了纯粹的内省/调试观点之外,可能还有更好的方法来实现您想要实现的目标。
例程§
子例程 full-barrier§
sub full-barrier()
执行一个完全内存屏障,防止读/写重新排序。实现一些无锁数据结构和算法时需要。