• 多线程实例


    多线程案例

    一个模拟的买票系统,使用num表示车票的数量:

     1 public class TicketCounter implements Runnable{
     2     private int num = 5;
     3     @Override
     4     public void run() {
     5         //因为while(true)所以可以多次执行直到num = 0;
     6         while(true){
     7             if(num > 0){
     8                  System.out.println(Thread.currentThread().getName() + ":" + num--);
     9             }
    10         }
    11         
    12     }
    13     
    14     public static void main(String[] args) {
    15         /**
    16          * 使用通过一个target,可以共享资源
    17          */
    18         TicketCounter counter = new TicketCounter();
    19         new Thread(counter, "1号").start();
    20         new Thread(counter, "2号").start();
    21         new Thread(counter, "3号").start();
    22     }
    23     
    24 }

    运行结果:

    使用Thread.sleep()进行延时:

     1 public class TicketCounter2 implements Runnable{
     2 private int num = 5;
     3 
     4 @Override
     5 public void run() {
     6 
     7 while(true){
     8 
     9 if(num > 0){
    10 try {
    11 Thread.sleep(1000);
    12 } catch (InterruptedException e) {
    13 e.printStackTrace();
    14 }
    15 System.out.println(Thread.currentThread().getName() + ":" + num--);
    16 }
    17 }
    18 }
    19 
    20 public static void main(String[] args) {
    21 TicketCounter2 counter = new TicketCounter2();
    22 new Thread(counter, "1号").start();
    23 new Thread(counter, "2号").start();
    24 new Thread(counter, "3号").start();
    25 }
    26 }

    运行结果:

    通过上述结果发现这个系统出现负数,明显得看出运行错误。

    如果想解决这种问题,就需要使用同步。所谓同步就是在统一时间段中只有有一个线程运行,

    其他的线程必须等到这个线程结束之后才能继续执行。

     同步

    同步方法1:

    【同步代码块】:

    语法格式:

    synchronized(同步对象){

    //需要同步的代码

    }

    public class TicketCounter2 implements Runnable{
    private int num = 5;
    
    @Override
    public void run() {
    
    while(true){
    synchronized (this) {
    if(num > 0){
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    
    System.out.println(Thread.currentThread().getName() + ":" + num--);
    }
    }
    }
    
    }
    
    public static void main(String[] args) {
    TicketCounter2 counter = new TicketCounter2();
    new Thread(counter, "1号").start();
    new Thread(counter, "2号").start();
    new Thread(counter, "3号").start();
    }
    }
    
     

    运行结果:

    同步方法2:采用同步方法。

    public class TicketCounter2 implements Runnable{
    private int num = 5;
    
    @Override
    public void run() {
    while(true){
    sale();
    }
    }
    
    public synchronized void sale(){
    if(num > 0){
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + ":" + num--);
    }
    }
    
    public static void main(String[] args) {
    TicketCounter2 counter = new TicketCounter2();
    new Thread(counter, "1号").start();
    new Thread(counter, "2号").start();
    new Thread(counter, "3号").start();
    }
    }

     运行结果:

    本文引用:资讯《Java多线程总结》,一起来围观吧

    http://ms.csdn.net/geek/238191

  • 相关阅读:
    接口自动化框架脚手架从Excel读取用例发起调用做断言
    复盘|接口自动化测试框架建设的经验与教训
    设计模式|理解单一职责原则
    吃透50个常用的SQL语句,面试趟过
    华为云发布三大生态举措,携手伙伴及开发者共创新价值
    3分钟整明白 缓存热点 是咋回事
    学妹一反常态主动联系我,我要不要答应帮她?
    手把手教你把 Git 子模块更新到主项目
    缓存穿透详解及解决方案
    3分钟整明白啥是 缓存雪崩
  • 原文地址:https://www.cnblogs.com/Dream2hc/p/java0001.html
Copyright © 2020-2023  润新知