java中的线程 - 编程入门网
行完后t2才有机会执行。
示例4: public class threadtest implements runnable{public void run(){synchronized(this){for(int i=0;i<10;i++){system.out.print(" " + i);}}}public static void main(string[] args){runnable r = new threadtest();thread t1 = new thread(r);thread t2 = new thread(r);t1.start();t2.start();}} 这个程序与示例3的运行结果一样。在可能的情况下,应该把保护范围缩到最小,可以用示例4的形式,this代表"这个对象"。没有必要把整个run()保护起来,run()中的代码只有一个for循环,所以只要保护for循环就可以了。 示例5: public class threadtest implements runnable{public void run(){for(int k=0;k<5;k++){system.out.println(thread.currentthread().getname()+ " : for loop : " + k);}synchronized(this){for(int k=0;k<5;k++){system.out.println(thread.currentthread().getname()+ " : synchronized for loop : " + k);}}}public static void main(string[] args){runnable r = new threadtest();thread t1 = new thread(r,"t1_name");thread t2 = new thread(r,"t2_name");t1.start();t2.start();}} 运行结果:t1_name:forloop:0 t1_name : for loop : 0t1_name : for loop : 1t1_name : for loop : 2t2_name : for loop : 0t1_name : for loop : 3t2_name : for loop : 1t1_name : for loop : 4t2_name : for loop : 2t1_name : synchronized for loop : 0t2_name : for loop : 3t1_name : synchronized for loop : 1t2_name : for loop : 4t1_name : synchronized for loop : 2t1_name : synchronized for loop : 3t1_name : synchronized for loop : 4t2_name : synchronized for loop : 0t2_name : synchronized for loop : 1t2_name : synchronized for loop : 2t2_name : synchronized for loop : 3t2_name : synchronized for loop : 4 第一个for循环没有受synchronized保护。对于第一个for循环,t1,t2可以同时访问。运行结果表明t1执行到了k=2时,t2开始执行了。t1首先执行完了第一个for循环,此时还没有执行完第一个for循环(t2刚执行到k=2)。t1开始执行第二个for循环,当t1的第二个for循环执行到k=1时,t2的第一个for循环执行完了。 t2想开始执行第二个for循环,但由于t1首先执行了第二个for循环,这个对象的锁标志自然在t1手中(synchronized方法的执行权也就落到了t1手中),在t1没执行完第二个for循环的时候,它是不会释放锁标志的。 所以t2必须等到t1执行完第二个for循环后,它才可以执行第二个for循环 三:sleep() 示例6: public class threadtest implements runnable{public void run(){for(int k=0;k<5;k++){if(k == 2){try{thread.currentthread().sleep(5000);}catch(exception e){}}system.out.print(" " + k);}}public static void main(string[] args){runnable r = new threadtest();thread t = new thread(r);t.start();}} java中的线程(4)时间:2007-11-05sleep方法会使当前的线程暂停执行一定时间(给其它线程运行机会)。读者可以运行示例6,看看结果就明白了。sleep方法会抛出异常,必须提供捕获代码。 示例7: public class threadtest implements runnable{public void run(){for(int k=0;k<5;k++){if(k == 2){try{thread.currentthread().sleep(5000);}catch(exception e){}}system.out.println(thread.currentthread().getname()+ " : " + k);}}public static void main(string[] args){runnable r = new threadtest |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |