黑马程序员技术交流社区
标题:
多线程yield
[打印本页]
作者:
爱上这格调
时间:
2013-9-26 13:56
标题:
多线程yield
{YC9BYH{K@GEU`3F2%FR{F3.jpg
(13.7 KB, 下载次数: 26)
下载附件
2013-9-26 13:54 上传
class CirOut implements Runnable
{
public void run()
{
for(int x = 0; x < 100; x++)
{
System.out.println(Thread.currentThread().getName()+"------"+x);
Thread.yield();
}
}
}
class ThreadTest
{
public static void main(String[] args)
{
CirOut cir = new CirOut();
Thread t1 = new Thread(cir);
Thread t2 = new Thread(cir);
t1.start();
t2.start();
}
}
yield方法临时释放执行权 执行其他线程 那按照这么说就应该是0线程和1线程交替执行的怎么还会出现这种情况 连着执行两次0线程
作者:
lizhangzhi
时间:
2013-9-26 14:18
释放执行权,并没有释放执行资格,线程0释放了执行权,仍有执行资格,然后和线程1共同夺取执行权,谁获取到执行权(只是个随机问题),就执行哪个线程,出现上面情况,是线程0释放执行权,再和线程1夺取执行权时,又获到了执行权,又执行了一遍线程0,多运行几遍,会出现线程0,1交替执行的结果;
作者:
简单ai...
时间:
2013-9-26 15:50
了解一下cpu运算机制,就好理解了
作者:
杨增坤
时间:
2013-9-27 07:33
那不是绝对的,那些得看线程获得 执行权。
作者:
周志龙
时间:
2013-9-27 10:46
这个是随机的,每次运行都不一样的结果的,如果你想按顺序走,那就进行加锁
作者:
HM李超
时间:
2013-9-27 18:59
首先你要知道Thread.yield()方法的作用,在我看来,此方法被执行后执行当前线程丧失执行权,并没有丧失执行资格,那么线程一样具有抢占CPU执行权的。可以理解成,当前线程的状态从执行状态转换到了就绪状态,线程仍然具有被执行的资格。
既然线程具有执行资格,那么你程序中的t1、t2两条线程具体是哪个线程能抢占到CPU的执行权,是不确定,这个得是CPU说了算,CPU切换到哪个线程,就执行哪个线程。
若想达到LZ初期想要的效果,可以试试修改t1、t2线程的优先级,setPriority(线程优先级)。一个线程设置最高优先级,另一个设置最低优先级。可以一试,不过运行的效果可能跟LZ想要的效果又不一样。这个也可以解释,即使修改了线程的优先级,也只能说明该线程比另一线程具有较多的执行机会,而不是说明该线程一定会比另一线程先执行。同样,可以理解为,线程的执行,要看CPU切换到哪个就运行哪个!
附上示例代码:
class TestYield extends Thread
{
public TestYield()
{
}
public TestYield(String name)
{
super(name);
}
public void run()
{
for(int i=0;i<50;i++)
{
System.out.println(getName()+" "+i);
if(i==20)
Thread.yield(); //使用yield方法让当前线程让步
}
}
public static void main(String[] args)
{
//启动两条并发线程
TestYield ty1=new TestYield("高级");
ty1.setPriority(Thread.MAX_PRIORITY); //将ty1设置成最高优先级
ty1.start();
TestYield ty2=new TestYield("低级"); //将ty2设置成最低优先级
ty2.setPriority(Thread.MIN_PRIORITY);
ty2.start();
}
}
复制代码
作者:
chensc
时间:
2013-9-28 11:02
学习学习!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2