La clase Thread

(PECL pthreads >= 2.0.0)

Introducción

Cuando se invoca al método start de Thread, se ejecutará el código del método run en un Thread diferente de forma asíncrona.

Después de ejecutar el método run, el Thread terminará inmediatamente; será unido al Thread creador en el momento apropiado.

Advertencia

Depender del motor para determinar cuándo un Thread debería unirse podría ocasionar un comportamiento no deseado; el programador debería ser explícito siempre que sea posible.

Sinopsis de la Clase

Thread extends Threaded implements Countable , Traversable , ArrayAccess {
/* Métodos */
public void detach ( void )
public integer getCreatorId ( void )
public static Thread getCurrentThread ( void )
public static integer getCurrentThreadId ( void )
public integer getThreadId ( void )
public static mixed globally ( void )
public boolean isJoined ( void )
public boolean isStarted ( void )
public boolean join ( void )
public void kill ( void )
public boolean start ([ integer $options ] )
/* Métodos heredados */
public array Threaded::chunk ( integer $size , boolean $preserve )
public integer Threaded::count ( void )
public bool Threaded::extend ( string $class )
public Threaded Threaded::from ( Closure $run [, Closure $construct [, array $args ]] )
public array Threaded::getTerminationInfo ( void )
public boolean Threaded::isRunning ( void )
public boolean Threaded::isTerminated ( void )
public boolean Threaded::isWaiting ( void )
public boolean Threaded::lock ( void )
public boolean Threaded::merge ( mixed $from [, mixed $overwrite ] )
public boolean Threaded::notify ( void )
public boolean Threaded::pop ( void )
public void Threaded::run ( void )
public mixed Threaded::shift ( void )
public mixed Threaded::synchronized ( Closure $block [, mixed $... ] )
public boolean Threaded::unlock ( void )
public boolean Threaded::wait ([ integer $timeout ] )
}

Tabla de contenidos

add a note add a note

User Contributed Notes 3 notes

up
9
german dot bernhardt at gmail dot com
8 months ago
<?php

class workerThread extends Thread {
public function
__construct($i){
 
$this->i=$i;
}

public function
run(){
  while(
true){
   echo
$this->i;
  
sleep(1);
  }
}
}

for(
$i=0;$i<50;$i++){
$workers[$i]=new workerThread($i);
$workers[$i]->start();
}

?>
up
-42
hanscastroadmn at gmail dot com
11 months ago
/*
    Programa para generar diccionarios de fuerza bruta con
    diferentes hilos usando Thread en PHP 5.4
*/

class FuerzaBruta extends Thread
{
    private $n;
    private $out;
    private $smap;
   
    public function FuerzaBruta($numero)
    {
        $this->n = $numero; // Numero de caracteres
       
        $this->smap = ['a','b','c','d'];
       
        $this->start();
    }
   
    public function run(){
        for($i = 0; $i < pow(count($this->smap), $this->n) - 1; $i++){
           $this->visualizar();
           $this->siguiente();
        }
       
        $this->visualizar();
    }
   
    public function siguiente(){
        $this->out[0]++;
        $m = 0;
        while($this->out[$m] == count($this->smap)){
            $this->out[$m++] = 0;
            $this->out[$m]++;
        }
    }
   
    public function visualizar(){
        $output = "";
        for($i = 0;$i < $this->n; $i++){
            $output += $this->smap[$this->out[$i]];
        }
       
        echo $output;
    }
   
}

//Genera todas las combinaciones de 5 caracteres.
for($i = 1; $i < 5; $i++) new FuerzaBruta($i);

// Algún error tendré...
up
-72
actrace at icloud dot com
1 year ago
<?php

class vote extends Thread {

    public
$res    = '';
    public
$url    = array();
    public
$name   = '';
    public
$runing = false;
    public
$lc     = false;

    public function
__construct($name) {

       
$this->res    = '暂无,第一次运行.';
       
$this->param    = 0;
       
$this->lurl   = 0;
       
$this->name   = $name;
       
$this->runing = true;
       
$this->lc     = false;
    }

    public function
run() {
        while (
$this->runing) {

            if (
$this->param != 0) {
               
$nt          = rand(1, 10);
                echo
"线程[{$this->name}]收到任务参数::{$this->param},需要{$nt}秒处理数据.\n";
               
$this->res   = rand(100, 999);
               
sleep($nt);
               
$this->lurl = $this->param;
               
$this->param   = '';
            } else {
                echo
"线程[{$this->name}]等待任务..\n";
            }
           
sleep(1);
        }
    }

}

//这里创建线程池.
$pool[] = new vote('a');
$pool[] = new vote('b');
$pool[] = new vote('c');

//启动所有线程,使其处于工作状态
foreach ($pool as $w) {
   
$w->start();
}

//派发任务给线程
for ($i = 1; $i < 10; $i++) {
   
$worker_content = rand(10, 99);
    while (
true) {
        foreach (
$pool as $worker) {
           
//参数为空则说明线程空闲
           
if ($worker->param=='') {
               
$worker->param = $worker_content;
                echo
"[{$worker->name}]线程空闲,放入参数{$worker_content},上次参数[{$worker->lurl}]结果[{$worker->res}].\n";
                break
2;
            }
        }
       
sleep(1);
    }
}
echo
"所有线程派发完毕,等待执行完成.\n";

//等待所有线程运行结束
while (count($pool)) {
   
//遍历检查线程组运行结束
   
foreach ($pool as $key => $threads) {
        if (
$worker->param=='') {
            echo
"[{$threads->name}]线程空闲,上次参数[{$threads->lurl}]结果[{$threads->res}].\n";
            echo
"[{$threads->name}]线程运行完成,退出.\n";
           
//设置结束标志
           
$threads->runing = false;
            unset(
$pool[$key]);
        }
    }
    echo
"等待中...\n";
   
sleep(1);
}
echo
"所有线程执行完毕.\n";
?>

父线程可以操作子线程变量,可以先启动一组线程等待来自父线程的参数,然后再工作.
To Top