java线程中sleep(),yield()和stop()的理解

时间:2022-05-31 23:31:45

1. Thread.yield():

    api中解释: 暂停当前正在执行的线程对象,并执行其他线程。

    注意:这里的其他也包含当前线程,所以会出现以下结果。

例子:

public class ThreadTest implements Runnable{
boolean keepRunning=true;
@Override
public void run() {
while(keepRunning){
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"["+i+"]");
Thread.yield();
}
}
System.out.println(Thread.currentThread().getName()+"结束...");
}
}
for循环里面加上一个yield(),表示执行了一次后,将时间片让出来,然后多个线程再继续抢时间片。(时间片,那个线程抢到时间片,那个就运行)
这个例子会出现很多交叉的现象,就是因为这个方法。输出一次后,让出时间片。

同级别的线程的情况下,谁也不知道下个时间片是那个线程拥有。

2. Thread.sleep(long millis):

 

     解释:使当前线程暂停millis所指定的毫秒,转到执行其它线程。

3. Thread.stop():

 

    解释:错误的停止线程的方法!!!

用一个词来形容就是戛然而止,立马停止。例如上面的代码案例,如果用stop方法停止线程,此时线程正在for中,则会立即停止,将不会执行while外的输出语句。

正确停止的方法则是,将当前线程的keepRunning属性赋值为false。只有在这样,线程才不会立即停止,并且会完整的结束。

拿上述代码举个例子:当for循环的i还没有结束时,则会将for运行结束后,最后显示当前线程结束。

总之而言,这样会使线程有始有终。