首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>java>Java基础>正文

对Java多线程技术中所有方法的详细解析

http://www.oklinux.cn  2008-01-20  来源: ccidnet 佚名  会员收藏  游客收藏  【 】 

一、run()和start()


这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由Java的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。


二、要害字Synchronized


这个要害字用于保护共享数据,当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问该对象时,被Synchronized修饰的数据将被“上锁”,阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。


public ThreadTest implements Runnable

{
public synchronized void run(){
for(int i=0;i<10;i )
{
System.out.println(" " i);
}
}
public static void main(String[] args)

{
Runnable r1 = new ThreadTest();
Runnable r2 = new ThreadTest();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}

}



以上这段程序中的 i 变量并不是共享数据,也就是这里的Synchronized要害字并未起作用。因为t1,t2两个线程是两个对象(r1,r2)的线程。不同的对象其数据是不同的,所以r1和r2两个对象的i变量是并不是共享数据。


当把代码改成如下:Synchronized要害字才会起作用

Runnable r = new ThreadTest();

Thread t1 = new Thread(r);

Thread t2 = new Thread(r);

t1.start();

t2.start();


三、sleep()


使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是假如有Synchronized同步块,其他线程仍然不同访问共享数据。注重该方法要捕捉异常


比如有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,假如没有Sleep()方法,只有高优先级的线程执行完成后,低优先级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。


总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。


四、join()


join()方法使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。注重该方法也要捕捉异常。


五、yield()


它与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。


六、wait()和notify()、notifyAll()


这三个方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用这三个方法。前面说过Synchronized这个要害字用于保护共享数据,阻止其他线程对共享数据的存取。但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。


wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有

锁标志等待池中的线程能够获取锁标志;假如锁标志等待池中没有线程,则notify()不起作用。


notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。


上一篇:JAVA高级--如何掌握JDK1.5的枚举类型   下一篇:深入浅出学习Java设计模式之迭代器模式


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·JAVA高级--如何掌握JDK1.5的枚举类型
·深入浅出学习Java设计模式之迭代器模式
·Java高级--Java线程运行栈信息的获取
·基于JDBC的数据库连接池高效的管理策略
·彻底明白Java的多线程及线程的同步过程
·eclipse正则表达式在编码过程中的运用
·在struts里实现dtree通用树型结构讲解
·Struts 的汉字显示问题终结解决之方案
·JAVA进阶:J2ME程序开发新手入门九大要点
·一定不要重新分配被锁定对象的对象引用
·Jsp输出excel文档和中文乱码问题的解决
·JAVA高级:J2ME中需要的Java基础知识
·面向Java开发人员db4o指南:数组和集合
·讨论分析应将应用程序的设定存在哪里?
·JAVA进阶--线程运行栈信息的获取讲解
·Java Interface 是常量存放最佳地点吗?
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Java入门:状态对象--数据库的替代者
·Java语言怎样调用外部应用程序
·Java语言深入--关于Java语言的内存泄漏
·JSP/Servlet/JSF:Servlet/JSP配置详解
·进阶-怎样使用AJAX进行WEB应用程序开发
·基础:J2ME程序开发之新手入门九大要点
·Java入门--Java语言接口与继承的本质
·JAVA进阶--如何提升JSP应用程序的效率
·对Java中四种XML解析技术之不完全测试
·编写高级 JScript应用代码
·JSP/Servlet/JSF--对标签库的深入研究
·Java入门--关于字符串分割的两种方法
  阅读排行
·使用AJAX技术实现网页无闪自动局部刷新
·快速教您Apache Tomcat SSL的配置
·Java语言深入--java调用C/C 的过程
·用JSP JavaScript打造二级级联下拉菜单
·JAVA进阶--线程运行栈信息的获取讲解
·使用WEBWORK实现文件上传方法实例详解
·J2SE综合--JAVA实现把汉字转化成拼音
·一个非常有趣的使用spring框架AOP例子
·关于java中相对路径,绝对路径问题总结
·高级:lucene全文检索应用示例及代码简
·详细讲解Struts构架中action的跳转大全
·Hibernate配置文件中的映射元素详解
·在Weblogic上配置JMS服务的方法
·对Java中四种XML解析技术之不完全测试
·基于AJAX的动态树型结构的设计与实现
网摘收藏: