日期:2014-05-20  浏览次数:20784 次

多线程的yield()是什么意思,有什么用法??
这个问题在朋友的论坛上看到的。。。

------解决方案--------------------
yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。

------解决方案--------------------
1) 通过yield ()函数,可使线程进入可执行状态,排程器从可执行状态的线程中重新进行排程。所以调用了yield()的函数也有可能马上被执行。
2) 当调用yield ()函数后,线程不会释放它的“锁标志”。

class TestThreadMethod extends Thread{
public static int shareVar = 0;
public TestThreadMethod(String name){
super(name);
}
public synchronized void run(){
for(int i=0; i<4; i++){
System.out.print(Thread.currentThread().getName());
System.out.println(" : " + i);
Thread.yield();
}
}
}
public class TestThread{
public static void main(String[] args){
TestThreadMethod t1 = new TestThreadMethod("t1");
TestThreadMethod t2 = new TestThreadMethod("t2");
t1.start();
t1.start(); //(1)
//t2.start(); (2)
}
}
运行结果为:
t1 : 0
t1 : 1
t1 : 2
t1 : 3
t1 : 0
t1 : 1
t1 : 2
t1 : 3
从结果可知调用yield()时并不会释放对象的“锁标志”。
如果把代码(1)注释掉,并去掉代码(2)的注释,结果为:
t1 : 0
t1 : 1
t2 : 0
t1 : 2
t2 : 1
t1 : 3
t2 : 2
t2 : 3
从结果可知,虽然t1线程调用了yield(),但它马上又被执行了。
------解决方案--------------------
yield
public static void yield()暂停当前正在执行的线程对象,并执行其他线程
------解决方案--------------------
这么说吧,当有多个线程同时在执行的时候,每个线程都有它分配的时间片
当这个时间片用完的时候,这个线程暂时不执行,换到下个线程执行,然后再给
它分配个时间片,再执行.....
yield()方法就是,当代码执行到yield()时,即使给这个线程分配的时间片没有
用完也不继续执行了,让给下个线程.让下个线程开始执行
------解决方案--------------------
简单一句话:使当前线程退出时间片。
------解决方案--------------------
yield()方法使当前线程进入可运行状态,给同优先级的其他可运行线程提供运行的机会,但是它的这种主动退出没有任何保障,就是在当前进入可运行状态时,还是有可能被JVM选中再回到运行状态的
------解决方案--------------------
探讨
简单一句话:使当前线程退出时间片。

------解决方案--------------------
yield()在声明:
“我已经执行生命中最重要的部分了,此刻正是切换给其它线程执行一段时间的大好机会”
对于重要的控制和调整最好不要用它。
------解决方案--------------------
yield()声明:“我已经执行完生命周期中最重要的部分了,此刻是切换其它任务执行一段时间的大好机会”


------解决方案--------------------
探讨
yield()之后由谁来唤醒呢??

------解决方案--------------------
大家都不学操作系统吗?
------解决方案--------------------
yield() 金山詞霸解釋 屈服 放棄~