广州凡科互联网科技有限公司

营业时间
MON-SAT 9:00-18:00

全国服务热线
18720358503

公司门店地址
广州市海珠区工业大道北67号凤凰创意园

Java高并发程序编写四 进程 wait与notify &&join,sl

日期:2021-02-28 浏览:
当今部位: > 技术性实例教程 Java高并发程序编写四 进程 wait与notify &&join,sleep,wait三者差别 - hong查理的本人室内空间 - OSCHINA 来源于: 创作者: 浏览频次:144
1.进程的wait,notify 干了甚么

    当2根线程在角逐一个锁时,在其中一根线程得到这把锁且实行了wait(),则这一进程舍弃这把锁的权利,让此外一根线程实行。当此外一根线程实行了notify的情况下则通告别的wait的进程能够来市场竞争这把锁了。

2.启用wait(4000)
public class Test {
 public static boolean isWait=false;
 public static void main(String [] args) throws InterruptedException {
 ThreadJoinTest t1 = new ThreadJoinTest("李雷");
 ThreadJoinTest t2 = new ThreadJoinTest("韩梅梅");
 t1.start();
 ThreadUtil.sleep(500);
 t2.start();
 System.out.println("Main thread is finished");
class ThreadJoinTest extends Thread{
 public ThreadJoinTest(String name){
 super(name);
 @Override
 public void run(){
 String obj = "".intern();
 synchronized (obj){
 for(int i=0;i 3;i++){
 try {
 if (!Test.isWait this.getName().equals("李雷")){
 System.out.println(this.getName() + "wait:" + DateUtil.formatTime(new Date()));
 Test.isWait=true;
 obj.wait(4000);
 }catch (Exception e){
 e.printStackTrace();
 System.out.println(this.getName() + ":" + DateUtil.formatTime(new Date()));
 if (this.getName().equals("韩梅梅")){
// obj.notify();
 ThreadUtil.sleep(1000);
}

实行結果 能看到,韩梅梅沒有notify的状况些,李雷等候了4秒后续续获得锁实行。

李雷wait:14:32:56
Main thread is finished
韩梅梅:14:32:56
韩梅梅:14:32:57
韩梅梅:14:32:58
李雷:14:33:00
李雷:14:33:01
李雷:14:33:02

3.启用wait()
public class Test {
 public static boolean isWait=false;
 public static void main(String [] args) throws InterruptedException {
 ThreadJoinTest t1 = new ThreadJoinTest("李雷");
 ThreadJoinTest t2 = new ThreadJoinTest("韩梅梅");
 t1.start();
 ThreadUtil.sleep(500);
 t2.start();
 System.out.println("Main thread is finished");
class ThreadJoinTest extends Thread{
 public ThreadJoinTest(String name){
 super(name);
 @Override
 public void run(){
 String obj = "".intern();
 synchronized (obj){
 for(int i=0;i 3;i++){
 try {
 if (!Test.isWait this.getName().equals("李雷")){
 System.out.println(this.getName() + "wait:" + DateUtil.formatTime(new Date()));
 Test.isWait=true;
 obj.wait();
 }catch (Exception e){
 e.printStackTrace();
 System.out.println(this.getName() + ":" + DateUtil.formatTime(new Date()));
 if (this.getName().equals("韩梅梅")){
// obj.notify();
 ThreadUtil.sleep(1000);
}

实行結果 能看到,韩梅梅沒有notify的状况下,李雷一直等待,且程序没法一切正常撤出。

4.启用wait()和notify()
public class Test {
 public static boolean isWait=false;
 public static void main(String [] args) throws InterruptedException {
 ThreadJoinTest t1 = new ThreadJoinTest("李雷");
 ThreadJoinTest t2 = new ThreadJoinTest("韩梅梅");
 t1.start();
 ThreadUtil.sleep(500);
 t2.start();
 System.out.println("Main thread is finished");
class ThreadJoinTest extends Thread{
 public ThreadJoinTest(String name){
 super(name);
 @Override
 public void run(){
 String obj = "".intern();
 synchronized (obj){
 for(int i=0;i 3;i++){
 try {
 if (!Test.isWait this.getName().equals("李雷")){
 System.out.println(this.getName() + "wait:" + DateUtil.formatTime(new Date()));
 Test.isWait=true;
 obj.wait();
 }catch (Exception e){
 e.printStackTrace();
 System.out.println(this.getName() + ":" + DateUtil.formatTime(new Date()));
 if (this.getName().equals("韩梅梅")){
 obj.notify();
 ThreadUtil.sleep(1000);
}

实行結果 能看到,韩梅梅notify后,李雷马上获得锁实行编码。

李雷wait:14:36:52
Main thread is finished
韩梅梅:14:36:53
韩梅梅:14:36:54
韩梅梅:14:36:55
李雷:14:36:56
李雷:14:36:57
李雷:14:36:58

5.join,sleep,wait的差别

3个方式都是使进程进到等候情况

join 和 sleep 是进程方式,join 会让主进程终止实行,而sleep总是让当今进程终止实行

wait是Object方式,wait会释放出来锁把資源给别的进程,别的两个不容易。



网站知识

联系方式丨CONTACT

  • 全国热线:18720358503
  • 传真热线:18720358503
  • Q Q咨询:2639601583
  • 企业邮箱:2639601583@qq.com

首页
电话
短信
联系