class Thread - activesupport-4.2.4 Documentation

# class Thread

### Public Instance Methods

freeze() click to toggle source

Freezes the thread so that thread local variables cannot be set via #thread_variable_set, nor can fiber local variables be set.

    me = Thread.current
    me.freeze
    me.thread_variable_set(:oliver, "a")  #=> RuntimeError: can't modify frozen thread locals
    me[:oliver] = "a"                     #=> RuntimeError: can't modify frozen thread locals

Calls superclass method

    # File lib/active_support/core_ext/thread.rb, line 72
    def freeze
      _locals.freeze
      super
    end

thread_variable?(key) click to toggle source

Returns `true` if the given string (or symbol) exists as a thread-local variable.

    me = Thread.current
    me.thread_variable_set(:oliver, "a")
    me.thread_variable?(:oliver)    # => true
    me.thread_variable?(:stanley)   # => false

Note that these are not fiber local variables. Please see #thread_variable_get for more details.

    # File lib/active_support/core_ext/thread.rb, line 61
    def thread_variable?(key)
      _locals.has_key?(key.to_sym)
    end

thread_variable_get(key) click to toggle source

Returns the value of a thread local variable that has been set. Note that these are different than fiber local values.

Thread local values are carried along with threads, and do not respect fibers. For example:

    Thread.new {
      Thread.current.thread_variable_set("foo", "bar") # set a thread local
      Thread.current["foo"] = "bar"                    # set a fiber local

      Fiber.new {
        Fiber.yield [
          Thread.current.thread_variable_get("foo"), # get the thread local
          Thread.current["foo"],                     # get the fiber local
        ]
      }.resume
    }.join.value # => ['bar', nil]

The value `"bar"` is returned for the thread local, where `nil` is returned for the fiber local. The fiber is executed in the same thread, so the thread local values are available.

    # File lib/active_support/core_ext/thread.rb, line 25
    def thread_variable_get(key)
      _locals[key.to_sym]
    end

thread_variable_set(key, value) click to toggle source

Sets a thread local with `key` to `value`. Note that these are local to threads, and not to fibers. Please see #thread_variable_get for more information.

    # File lib/active_support/core_ext/thread.rb, line 32
    def thread_variable_set(key, value)
      _locals[key.to_sym] = value
    end

thread_variables() click to toggle source

Returns an array of the names of the thread-local variables (as Symbols).

    thr = Thread.new do
      Thread.current.thread_variable_set(:cat, 'meow')
      Thread.current.thread_variable_set("dog", 'woof')
    end
    thr.join               # => #<Thread:0x401b3f10 dead>
    thr.thread_variables   # => [:dog, :cat]

Note that these are not fiber local variables. Please see #thread_variable_get for more details.

    # File lib/active_support/core_ext/thread.rb, line 47
    def thread_variables
      _locals.keys
    end

### Private Instance Methods

_locals() click to toggle source

    # File lib/active_support/core_ext/thread.rb, line 79
    def _locals
      if defined?(@_locals)
        @_locals
      else
        LOCK.synchronize { @_locals ||= {} }
      end
    end