PHP 5.6.0 released

Thread クラス

(PECL pthreads >= 2.0.0)

導入

このオブジェクトの start メソッドが呼ばれると、run メソッドのコードが個別のスレッドで非同期で実行されます。

run メソッドの実行後は Thread はすぐに終了し、作成元のスレッドに適切な時期に join します。

警告

Thread をいつ join させるのかをエンジンに決めさせていると、予期せぬ振る舞いを引き起こすことがあります。 可能な限り、プログラマーが明示的に指定するようにしましょう。

クラス概要

Thread extends Threaded implements Countable , Traversable , ArrayAccess {
/* メソッド */
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 ] )
/* 継承したメソッド */
public array Threaded::chunk ( integer $size , boolean $preserve )
public integer Threaded::count ( void )
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 boolean Threaded::shift ( void )
public mixed Threaded::synchronized ( Closure $block [, mixed $... ] )
public boolean Threaded::unlock ( void )
public boolean Threaded::wait ([ integer $timeout ] )
}

目次

add a note add a note

User Contributed Notes 3 notes

up
6
german dot bernhardt at gmail dot com
4 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
-30
hanscastroadmn at gmail dot com
7 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
-59
actrace at icloud dot com
8 months 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