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

问题描述

一、run()和start()  这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用run()方法,这是由Java的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.  二、关键字Synchronized  这个关键字用于保护共享数据,当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问该对象时,被Synchronized修饰的数据将被“上锁”,阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。  以下是引用片段:publicThreadTestimplementsRunnable  {  publicsynchronizedvoidrun(){  for(inti=0;i<10;i++)  {  System.out.println(""+i);  }  }  publicstaticvoidmain(String[]args)  {  Runnabler1=newThreadTest();  Runnabler2=newThreadTest();  Threadt1=newThread(r1);  Threadt2=newThread(r2);  t1.start();  t2.start();  }  }  以上这段程序中的i变量并不是共享数据,也就是这里的Synchronized关键字并未起作用。因为t1,t2两个线程是两个对象(r1,r2)的线程。不同的对象其数据是不同的,所以r1和r2两个对象的i变量是并不是共享数据。  当把代码改成如下:Synchronized关键字才会起作用 以下是引用片段: Runnabler=newThreadTest();  Threadt1=newThread(r);  Threadt2=newThread(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()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

解决方案

解决方案二:
好,总结的还算可以~
解决方案三:
该回复于2011-04-12 09:37:13被版主删除
解决方案四:
三、sleep()优先级级别说的有点模糊容易产生误解,JVM对调用线程时最大的几率调用优先级别高的线程,不是说没有可能不先调用优先级底的线程。五、yield()补充的地方是:同级别和优先级跟高的线程有执行的机会。
解决方案五:
该回复于2011-04-12 13:42:51被版主删除

时间: 2024-08-30 14:58:05

Java多线程技术中所有方法的详细解析的相关文章

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

一.run()和start() 这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由Java的内存机制规定的.并且run()方法必须是public访问权限,返回值类型为void. 二.关键字Synchronized 这个关键字用于保护共享数据,当然前提是要分清哪些数据是共享数据.每个对象都有一个锁标志,当一个线程访问该对象时,被Synchronized修饰的数据将被"上锁",阻止其他线程访问.当前线程访问完这部

java多线程技术在当前应用中所发挥的作用

问题描述 大家好,请教一个问题?关于java多线程技术在当前应用上发挥的作用大吗?他的当前使用状况怎么样呢?发展前景怎样呢? 解决方案 解决方案二:做web开发,基本上不需要自己写多线程,基本上是容器实现,网络编程/游戏开发,用的应该比较多了,比如想在手机上写一个像样的基于J2ME的游戏,不用多线程怎么做?解决方案三:请问:有没很好的博客地址让我赏读下呢?关于java多线程技术当前的应用(有成功的案例才好)以及今后的发展情况!楼上,谢喽解决方案四:你要了解javaEE的servlet机制就是建立

Java 编程技术中汉字问题的分析及解决(转)

编程|汉字|解决|问题 Java 编程技术中汉字问题的分析及解决 段明辉自由撰稿人2000 年 11月 8日内容: 汉字编码的常识 Java 中文问题的初步认识 Java 中文问题的表层分析及处理 Java 中文问题的根源分析及解决 Java Servlet 中文问题的根源 修改 Servlet.jar 中文乱码的处理函数 参考资料 作者简介在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题.一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Jav

Java 编程技术中汉字问题的分析及解决(转自IBM)

编程|汉字|解决|问题 Java 编程技术中汉字问题的分析及解决 段明辉自由撰稿人2000 年 11月 8日 在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题.一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Java 语言默认的编码方式是UNICODE ,而我们中国人通常使用的文件和数据库都是基于 GB2312 或者 BIG5 等方式编码的,怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢?本文将从汉字编码的常识入手,结合 Java 编

java的awt中的方法在安卓中如何对应?

问题描述 java的awt中的方法在安卓中如何对应? import java.awt.Frame; import java.awt.Image; import java.awt.MediaTracker; import java.awt.image.PixelGrabber; 在安卓中这些都是报错的,请求大神帮忙解决 解决方案 android中没有awt的包,也无法运行awt. 根据界面重新写布局xml文件.

thinkPHP js文件中U方法不被解析问题的解决方法_php实例

本文实例分析了thinkPHP js文件中U方法不被解析问题.分享给大家供大家参考,具体如下: 我想在js文件中写ajax, 写完发现异常, 本以为是js文件中不支持ajax 后来发现时地址解析错误. 也就是U方法在js文件中不被解析. 貌似thinkphp解析,tpl文件中的一些元素. js文件中的ajax function ajaxCheckTel(tel,id){ var res = ''; $.ajax({ type:"post", url:ajaxurl, // 地址解析有误

thinkPHP js文件中U方法不被解析问题的解决方法

本文实例分析了thinkPHP js文件中U方法不被解析问题.分享给大家供大家参考,具体如下: 我想在js文件中写ajax, 写完发现异常, 本以为是js文件中不支持ajax 后来发现时地址解析错误. 也就是U方法在js文件中不被解析. 貌似thinkphp解析,tpl文件中的一些元素. js文件中的ajax function ajaxCheckTel(tel,id){ var res = ''; $.ajax({ type:"post", url:ajaxurl, // 地址解析有误

Java多线程编程中使用Condition类操作锁的方法详解_java

Condition的作用是对锁进行更精确的控制.Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法.不同的是,Object中的wait(),notify(),notifyAll()方法是和"同步锁"(synchronized关键字)捆绑使用的:而Condition是需要与"互斥

Java多线程程序中synchronized修饰方法的使用实例_java

在Java 5以前,是用synchronized关键字来实现锁的功能. synchronized关键字可以作为方法的修饰符(同步方法),也可作用于函数内的语句(同步代码块). 掌握synchronized,关键是要掌握把那个东西作为锁.对于类的非静态方法(成员方法)而言,意味着要取得对象实例的锁:对于类的静态方法(类方法)而言,要取得类的Class对象的锁:对于同步代码块,要指定取得的是哪个对象的锁.同步非静态方法可以视为包含整个方法的synchronized(this) { - }代码块.