快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
n e) {} } System.out.println(Thread.currentThread().getName() + " : " + 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.setPriority(Thread.MAX_PRIORITY); t2.setPriority(Thread.MIN_PRIORITY); t1.start(); t2.start(); } }

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

时间:2010-12-20

t1被设置了最高的优先级,t2被设置了最低的优先级。t1不执行完,t2就没有机会执行。但由于t1在执行的中途休息了5秒中,这使得t2就有机会执行了。读者可以运行这个程序试试看。

示例8:

public class ThreadTest implements Runnable { public synchronized 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(); Thread t1 = new Thread(r,"t1_name"); Thread t2 = new Thread(r,"t2_name"); t1.start(); t2.start(); } }

请读者首先运行示例8程序,从运行结果上看:一个线程在sleep的时候,并不会释放这个对象的锁标志。

四:join()

示例9:

public class ThreadTest implements Runnable { public static int a = 0; public void run() { for(int k=0;k<5;k++) { a = a + 1; } } public static void main(String[] args) { Runnable r = new ThreadTest(); Thread t = new Thread(r); t.start(); System.out.println(a); } }

请问程序的输出结果是5吗?答案是:有可能。其实你很难遇到输出5的时候,通常情况下都不是5。这里不讲解为什么输出结果不是5,我要讲的是:怎样才能让输出结果为5!其实很简单,join()方法提供了这种功能。join()方法,它能够使调用该方法的线程在此之前执行完毕。

把示例9的main()方法该成如下这样:

public static void main(String[] args) throws Exception { Runnable r = new ThreadTest(); Thread t = new Thread(r); t.start(); t.join(); System.out.println(a); }

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

时间:2010-12-20

这时,输出结果肯定是5!join()方法会抛出异常,应该提供捕获代码。或留给JDK捕获。

示例10:

public class ThreadTest implements Runnable { public void run() { for(int k=0;k<10;k++) { System.out.print(" " + k); } } public static void main(String[] args) throws Exception { Runnable r = new ThreadTest(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start(); t1.join(); t2.start(); } }

运行这个程序,看看结果是否与示例3一样?

五:yield()

yield()方法与sleep()方法相似,只是它不能由用户指定线程暂停多长时间。按照SUN的说法:sleep方法可以使低优先级的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会。而yield()方法只能使同优先级的线程有执行的机会。

示例11:

public class ThreadTest implements Runnable { public void run() { 8 for(int k=0;k<10;k++) { if(k == 5 && Thread.currentThread().getName().equals("t1")) { Thread.yield(); } System.out.println(Thread.currentThread().getName() + " : " + k); } } public static void main(String[] args) { Runnable r = new ThreadTest(); Thread t1 = new Thread(r,"t1

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