多线程售票

多线程售票

多线程操作资源类

创建启动线程的写法public Thread(Runnable target, String name).start()

线程的6种状态,线程调用start方法后不会立即执行,而是要等待空闲CPU的调度

使用ReentrantLock保证资源类的安全

package com.zbiti.juc;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//多线程操作资源类 3个售票员 操作 50张票
public class SaleTicket {
    public static void main(String[] args) throws InterruptedException {
        Ticket ticket = new Ticket();

        new Thread(()->{
            for(int i=0;i<40;i++){
                ticket.sale();
            }
        },"AA").start();
        new Thread(()->{
            for(int i=0;i<40;i++){
                ticket.sale();
            }
        },"BB").start();
        new Thread(()->{
            for(int i=0;i<40;i++){
                ticket.sale();
            }
        },"CC").start();

        TimeUnit.SECONDS.sleep(5);
    }
}

@Slf4j
class Ticket{
    static int ticket=50;
    Lock lock = new ReentrantLock();

    public void sale(){
        try{
            lock.lock();
            if(ticket>0){
                log.info("线程{},第{}张票售出,剩余{}张票",Thread.currentThread().getName(),ticket--,ticket);
            }
        }catch (Exception e){
            log.info("售票异常--->{}",e);
        }finally {
            lock.unlock();
        }
    }
}

结果

21:34:56.147 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第50张票售出,剩余49张票
21:34:56.155 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第49张票售出,剩余48张票
21:34:56.155 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第48张票售出,剩余47张票
21:34:56.155 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第47张票售出,剩余46张票
21:34:56.155 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第46张票售出,剩余45张票
21:34:56.155 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第45张票售出,剩余44张票
21:34:56.155 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第44张票售出,剩余43张票
21:34:56.156 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第43张票售出,剩余42张票
21:34:56.156 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第42张票售出,剩余41张票
21:34:56.156 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第41张票售出,剩余40张票
21:34:56.156 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第40张票售出,剩余39张票
21:34:56.156 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第39张票售出,剩余38张票
21:34:56.156 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第38张票售出,剩余37张票
21:34:56.156 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第37张票售出,剩余36张票
21:34:56.156 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第36张票售出,剩余35张票
21:34:56.156 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第35张票售出,剩余34张票
21:34:56.156 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第34张票售出,剩余33张票
21:34:56.156 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第33张票售出,剩余32张票
21:34:56.157 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第32张票售出,剩余31张票
21:34:56.157 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第31张票售出,剩余30张票
21:34:56.157 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第30张票售出,剩余29张票
21:34:56.157 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第29张票售出,剩余28张票
21:34:56.157 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第28张票售出,剩余27张票
21:34:56.157 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第27张票售出,剩余26张票
21:34:56.157 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第26张票售出,剩余25张票
21:34:56.157 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第25张票售出,剩余24张票
21:34:56.157 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第24张票售出,剩余23张票
21:34:56.157 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第23张票售出,剩余22张票
21:34:56.157 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第22张票售出,剩余21张票
21:34:56.157 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第21张票售出,剩余20张票
21:34:56.158 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第20张票售出,剩余19张票
21:34:56.158 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第19张票售出,剩余18张票
21:34:56.158 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第18张票售出,剩余17张票
21:34:56.158 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第17张票售出,剩余16张票
21:34:56.158 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第16张票售出,剩余15张票
21:34:56.158 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第15张票售出,剩余14张票
21:34:56.158 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第14张票售出,剩余13张票
21:34:56.158 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第13张票售出,剩余12张票
21:34:56.158 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第12张票售出,剩余11张票
21:34:56.158 [CC] INFO com.zbiti.juc.Ticket - 线程CC,第11张票售出,剩余10张票
21:34:56.159 [BB] INFO com.zbiti.juc.Ticket - 线程BB,第10张票售出,剩余9张票
21:34:56.159 [BB] INFO com.zbiti.juc.Ticket - 线程BB,第9张票售出,剩余8张票
21:34:56.160 [BB] INFO com.zbiti.juc.Ticket - 线程BB,第8张票售出,剩余7张票
21:34:56.160 [BB] INFO com.zbiti.juc.Ticket - 线程BB,第7张票售出,剩余6张票
21:34:56.160 [BB] INFO com.zbiti.juc.Ticket - 线程BB,第6张票售出,剩余5张票
21:34:56.160 [BB] INFO com.zbiti.juc.Ticket - 线程BB,第5张票售出,剩余4张票
21:34:56.160 [BB] INFO com.zbiti.juc.Ticket - 线程BB,第4张票售出,剩余3张票
21:34:56.160 [BB] INFO com.zbiti.juc.Ticket - 线程BB,第3张票售出,剩余2张票
21:34:56.160 [BB] INFO com.zbiti.juc.Ticket - 线程BB,第2张票售出,剩余1张票
21:34:56.160 [BB] INFO com.zbiti.juc.Ticket - 线程BB,第1张票售出,剩余0张票

函数式接口

  • 函数式接口 只有一个方法声明、可以有多个default实例方法、可以有多个static静态方法
  • 函数式接口有@FunctionalInterface注解,只有一个方法声明,就算不写@FunctionalInterface,也会隐式带上的,如果写了@FunctionalInterface注解,声明了多个方法会编译不通过
  • 函数式接口里的方法声明可以使用箭头函数
  • 箭头函数写法 拷贝小括号 写死右箭头 落地大括号
package com.zbiti.juc;

//函数式接口 只有一个方法声明、可以有多个default实例方法、可以有多个静态方法
//函数式接口有@FunctionalInterface注解,只有一个方法声明,就算不写@FunctionalInterface,也会隐式带上的,如果写了@FunctionalInterface注解,声明了多个方法会编译不通过
//函数式接口可以使用箭头函数
//箭头函数写法 拷贝小括号 写死右箭头 落地大括号
@FunctionalInterface
interface LamdInterface {
    //    void sayHello();
//    void sayBye();
    int add(int a, int b);

    default void run() {
        System.out.println("run----->");
    }

    default void cry() {
        System.out.println("cry----->");
    }

    static void sleep() {
        System.out.println("sleep---->");
    }

    static void eat() {
        System.out.println("eat---->");
    }

}

public class LamdExpress {
    public static void main(String[] args) {
//        LamdInterface lamdInterface=()->{
//          System.out.println("sayHello---->");

//        };
//        lamdInterface.sayHello();

        LamdInterface lamdInterface = (int a, int b)->{
            return a*b;
        };
        System.out.println(lamdInterface.add(3,5));

        lamdInterface.run();
        lamdInterface.cry();
        LamdInterface.sleep();
    }
}

 上一篇
集合类不安全 集合类不安全
集合类不安全ArrayList集合类不安全 故障现象java.util.ConcurrentModificationException 导致原因 多线程对集合的并发操作导致并发修改异常的产生 解决方案 Vector(加synchroniz
2019-11-28
下一篇 
oracle定时执行存储过程 oracle定时执行存储过程
需求每小时进行一次查询统计数据,并将数据插入到自定义的表当中 效果 创建存储过程create or replace procedure summary_data as v_dcppv number; v_jd12h number;
2019-11-20
  目录