快速业务通道

彻底明白Java的多线程-线程间的通信 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
;仍被代码(5)所产生的线程占有。

2.2 sleep()

1) sleep ()函数有一个参数,通过参数可使线程在指定的时间内进入停滞状态,当指定的时间过后,线程则自动进入可执行状态。

2) 当调用sleep ()函数后,线程不会释放它的“锁标志”。

例12:

class TestThreadMethod extends Thread{

class TestThreadMethod extends Thread{

public static int shareVar = 0;

public TestThreadMethod(String name){

super(name);

}

public synchronized void run(){

for(int i=0; i<3; i++){

System.out.print(Thread.currentThread().getName());

System.out.println(" : " + i);

try{

Thread.sleep(100); //(4)

}

catch(InterruptedException e){

System.out.println("Interrupted");

}

}

}

}

public class TestThread{

public static void main(String[] args){

TestThreadMethod t1 = new TestThreadMethod("t1");

TestThreadMethod t2 = new TestThreadMethod("t2");

t1.start(); (1)

t1.start(); (2)

//t2.start(); (3)

}

}

运行结果为:

t1 : 0

t1 : 1

t1 : 2

t1 : 0

t1 : 1

t1 : 2

彻底明白Java的多线程-线程间的通信(3)

时间:2011-01-25

由结果可证明,虽然在run()中执行了sleep(),但是它不会释放对象的“锁标志”,所以除非代码(1)的线程执行完run()函数并释放对象的“锁标志”,否则代码(2)的线程永远不会执行。

如果把代码(2)注释掉,并去掉代码(3)的注释,结果将变为:

t1 : 0

t2 : 0

t1 : 1

t2 : 1

t1 : 2

t2 : 2

由于t1和t2是两个对象的线程,所以当线程t1通过sleep()进入停滞时,排程器会从线程池中调用其它的可执行线程,从而t2线程被启动。

例13:    class TestThreadMethod extends Thread{    public static int shareVar = 0;    public TestThreadMethod(String name){    super(name);    }    public synchronized void run(){    for(int i=0; i<5; i++){    System.out.print(Thread.currentThread().getName());    System.out.println(" : " + i);    try{    if(Thread.currentThread().getName().equals("t1"))    Thread.sleep(200);    else    Thread.sleep(100);    }    catch(InterruptedException e){    System.out.println("Interrupted");    }    }    }    }    public class TestThread{    public static void main(String[] args){    TestThreadMethod t1 = new TestThreadMethod("t1");    TestThreadMethod t2 = new TestThreadMethod("t2");    t1.start();    //t1.start();    t2.start();    }    }    运行结果为:    t1 : 0    t2 : 0    t2 : 1    t1 : 1    t2 : 2    t2 : 3    t1 : 2    t2 : 4    t1 : 3    t1 : 4    由于线程t1调用了sleep(200),而线程t2调用了sleep(100),所以线程t2处于停滞状态的时间是线程t1的一半,从从结果反映出来的就是线程t2打印两倍次线程t1才打印一次。    2.3 yield()    1) 通过yield ()函数,可使线程进入可执行状态,排程器从可执行状态的线程中重新进行排程。所以调用了yield()的函数也有可能马上被执行。    2) 当调用yield ()函数后,线程不会释放它的“锁标志”。    例14:    class TestThreadMethod extends Thread{    public static int shareVar = 0;    public TestThreadMethod(String n

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号