OK, I think I get it.
Froeach loop hold a pointer, and changes it on each iteration.
Sometimes, the thread is created, but still not running.
meanwhile, the loop changes the pointer at the following iteration, and when the thread starts its job, it get the current pointer's value (the subsequent string).
BTW, I found another solution here, how to pass parameters to main function of the thread, so I fixed my loop and it works properly now
foreach (string server in stringList)
{
Thread thread1 = new Thread(new ParameterizedThreadStart(Threadjob));
thread1.Start(server);
}