# threaded_call/1-2

## Description

    threaded_call(Goal)
    threaded_call(Goal, Tag)

Proves `Goal` asynchronously using a new thread. The argument can be a message sending goal. Calls to this predicate always succeeds and return immediately. The results (success, failure, or exception) are sent back to the message queue of the object containing the call (this) and can be retrieved by calling the threaded_exit/1 predicate.

The `threaded_call/2` variant returns a threaded call identifier tag that can be used with the threaded_exit/2 and threaded_cancel/1 predicates. Tags shall be regarded as opaque terms; users shall not rely on its type.

## Modes and number of proofs

    threaded_call(@callable) - one
    threaded_call(@callable, --nonvar) - one

## Errors

Goal is a variable:
`instantiation_error`
Goal is neither a variable nor a callable term:
`type_error(callable, Goal)`
Tag is not a variable:
`type_error(variable, Goal)`

## Examples

Prove `Goal` asynchronously in a new thread:
`threaded_call(Goal)`
Prove `::Message` asynchronously in a new thread:
`threaded_call(::Message)`
Prove `Object::Message` asynchronously in a new thread:
`threaded_call(Object::Message)`

See also

threaded_exit/1-2, threaded_ignore/1, threaded_once/1-2, threaded_peek/1-2, threaded_cancel/1, threaded/1, synchronized/1