栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java线程使用同步锁交替执行打印奇数偶数的方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java线程使用同步锁交替执行打印奇数偶数的方法

对同一个对象进行多线程操作时,如何保证线程执行结果的一致性?我们需要对线程操作对象加同步锁。(这是一道面试题)

需求描述

1-20个数字

A线程打印奇数:1,3,5,7,9,11,13,15,17,19

B线程打印偶数:2,4,6,8,10,12,14,16,18,20

C线程在AB两个线程执行完了之后打印结果:“success”。

线程代码实现

Num.java

package com.boonya.thread.test;
 

public class Num {
  int value=1;
}

AThread.java

package com.boonya.thread.test;
 

public class AThread implements Runnable{
 
  Num num;
 
  public AThread(Num num){
    this.num=num;
  }
 
  public void run() {
    while (num.value<20){
      synchronized (num){
 if(num.value%2!=0){
   System.out.println("AThread:"+ num.value);
   num.value++;
 }
      }
    }
 
  }
}

BThread.java

package com.boonya.thread.test;
 

public class BThread implements Runnable {
 
    Num num;
 
    public BThread(Num num){
      this.num=num;
    }
 
    public void run() {
      while (num.value<=20){
 synchronized (num){
   if(num.value%2==0){
     System.out.println("BThread:"+ num.value);
     num.value++;
   }
 }
      }
    }
 }

CThread.java

package com.boonya.thread.test;
 

public class CThread implements Runnable {
 
    Num num;
 
    public CThread(Num num){
      this.num=num;
    }
 
    public void run() {
      while (num.value<20){
 try {
   Thread.sleep(1);
 } catch (InterruptedException e) {
   e.printStackTrace();
 }
      }
      System.out.println("CThread:success!");
    }
  }

MainTest.java

package com.boonya.thread.test;
 
import java.util.ArrayList;
import java.util.List;
 

public class MainTest {
 
  public static void main(String[] args) {
    Num num=new Num();
    Thread a=new Thread(new AThread(num));
    Thread b=new Thread(new BThread(num));
    Thread c=new Thread(new CThread(num));
    a.start();
    b.start();
    c.start();
  }
}

测试结果

"C:Program FilesJavajdk1.8.0_121binjava" "-javaagent:C:UsersboonyaAppDataRoamingJetBrainsIntelliJ IDEA 2017.2.5libidea_rt.jar=51911:C:UsersboonyaAppDataRoamingJetBrainsIntelliJ IDEA 2017.2.5bin" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJavajdk1.8.0_121jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_121jrelibdeploy.jar;C:Program FilesJavajdk1.8.0_121jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.8.0_121jrelibextcldrdata.jar;C:Program FilesJavajdk1.8.0_121jrelibextdnsns.jar;C:Program FilesJavajdk1.8.0_121jrelibextjaccess.jar;C:Program FilesJavajdk1.8.0_121jrelibextjfxrt.jar;C:Program FilesJavajdk1.8.0_121jrelibextlocaledata.jar;C:Program FilesJavajdk1.8.0_121jrelibextnashorn.jar;C:Program FilesJavajdk1.8.0_121jrelibextsunec.jar;C:Program FilesJavajdk1.8.0_121jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.8.0_121jrelibextsunmscapi.jar;C:Program FilesJavajdk1.8.0_121jrelibextsunpkcs11.jar;C:Program FilesJavajdk1.8.0_121jrelibextzipfs.jar;C:Program FilesJavajdk1.8.0_121jrelibjavaws.jar;C:Program FilesJavajdk1.8.0_121jrelibjce.jar;C:Program FilesJavajdk1.8.0_121jrelibjfr.jar;C:Program FilesJavajdk1.8.0_121jrelibjfxswt.jar;C:Program FilesJavajdk1.8.0_121jrelibjsse.jar;C:Program FilesJavajdk1.8.0_121jrelibmanagement-agent.jar;C:Program FilesJavajdk1.8.0_121jrelibplugin.jar;C:Program FilesJavajdk1.8.0_121jrelibresources.jar;C:Program FilesJavajdk1.8.0_121jrelibrt.jar;C:UsersboonyaDesktopJavaAlgorithmtargettest-classes;C:UsersboonyaDesktopJavaAlgorithmtargetclasses" com.boonya.thread.test.MainTest
AThread:1
BThread:2
AThread:3
BThread:4
AThread:5
BThread:6
AThread:7
BThread:8
AThread:9
BThread:10
AThread:11
BThread:12
AThread:13
BThread:14
AThread:15
BThread:16
AThread:17
BThread:18
AThread:19
BThread:20
CThread:success!
 
Process finished with exit code 0

注意:synchronized 作为方法块使用时需要只能对对象加锁,不能是常用数据类型。

AB线程改进:使用线程等待和通知

AThread.java

package com.boonya.thread.test;
 

public class AThread implements Runnable{
 
  Num num;
 
  public AThread(Num num){
    this.num=num;
  }
 
  public void run() {
    while (num.value<20){
      synchronized (num){
 if(num.value%2!=0){
   System.out.println("AThread:"+ num.value);
   num.value++;
   //num.notify();
   num.notifyAll();
 }else{
   try {
     num.wait();
   } catch (InterruptedException e) {
     e.printStackTrace();
   }
 }
      }
    }
 
  }
}

BThread.java

package com.boonya.thread.test;
 

public class BThread implements Runnable {
 
    Num num;
 
    public BThread(Num num){
      this.num=num;
    }
 
    public void run() {
      while (num.value<=20){
 synchronized (num){
   if(num.value%2==0){
     System.out.println("BThread:"+ num.value);
     num.value++;
     //num.notify();
     num.notifyAll();
   }else{
     try {
num.wait();
     } catch (InterruptedException e) {
e.printStackTrace();
     }
   }
 }
      }
    }
 }

注:线程等待和通知的操作是节省CPU运算的一种方式,避免CPU空转(线程方法一直不停地跑类似于死循环是很可怕的),如果是要让线程停下来需要调用线程的wait()。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/139049.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号