快速业务通道

JAVA技术专题综述之线程篇 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
他线程(t2)无法访问synchronized方法(run方法)。只有当t1执行完后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 : for loop : 0 t1_name : for loop : 1 t1_name : for loop : 2 t2_name : for loop : 0 t1_name : for loop : 3 t2_name : for loop : 1 t1_name : for loop : 4 t2_name : for loop : 2 t1_name : synchronized for loop : 0 t2_name : for loop : 3 t1_name : synchronized for loop : 1 t2_name : for loop : 4 t1_name : synchronized for loop : 2 t1_name : synchronized for loop : 3 t1_name : synchronized for loop : 4 t2_name : synchronized for loop : 0 t2_name : synchronized for loop : 1 t2_name : synchronized for loop : 2 t2_name : synchronized for loop : 3 t2_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循环。

JAVA技术专题综述之线程篇(3)

时间:2010-12-20

三: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(); } }

sleep方法会使当前的线程暂停执行一定时间(给其它线程运行机会)。读者可以运行示例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(Exceptio

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号