use Thread::Semaphore; my $todosem = new Thread::Semaphore; my @TodoList; ... my $temp = Thread->new(\&Monitor); $todosem->down; $TodoList[0][7] = "running"; $todosem->up; foreach $thread (Thread->list) { while(1){#wait for a thread to be finished foreach $thread (Thread->list) { $bool = $thread->done; #thread is done? last if ($bool);# if $bool true exit foreach } last if ($bool);# if $bool true exit while } $thread->join();# join this Workerthread } sub Monitor(){ my $arraysize = @TodoList; while (1) { $todosem->down; for(my $i=0; $i < $arraysize; $i++){ print $TodoList[$i][7]; } $todosem->up; sleep 5; } }