多线程售票
多线程操作资源类
创建启动线程的写法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();
}
}
本文由博客一文多发平台 OpenWrite 发布!