本文共 5055 字,大约阅读时间需要 16 分钟。
我是 ABin-阿斌:写一生代码,创一世佳话,筑一揽芳华。 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦。
![]()
public class JUC01_saleTicket01 { //main 一切程序的入口 public static void main(String[] args) { //1.2 初始化资源类 Ticket01 ticket = new Ticket01(); //1.3 线程:有三个售票员就新建三个线程,三个线程操作同一个资源类 //实际使用 Thread(Runnable target, String name) 新建进程 //使用匿名内部类,直接 new 一个 Runnable 接口对象 //进程 1 new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 30; i++){ ticket.sale(); } } },"Thread_A").start(); //进程2 new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 30; i++){ ticket.sale(); } } },"Thread_B").start(); //进程3 new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 30; i++){ ticket.sale(); } } },"Thread_C").start(); }}//1.1 资源类//需要做到高内聚,就要把对自己的操作的方法、把对外提供的功能放在自己身上class Ticket01 { private int number = 30; //资源类,自带了对外提供的功能 // 使用 synchronized 进行加锁 public synchronized void sale() { //售票的业务逻辑 if (number > 0) { System.out.println(Thread.currentThread().getName() + " 卖出第:" + (number--) + "票,还剩下:" + number + "张"); } }}
public class JUC01_saleTicket01 { //main 一切程序的入口 public static void main(String[] args) { //1.2 初始化资源类 Ticket01 ticket = new Ticket01(); //1.3 线程:有三个售票员就新建三个线程,三个线程操作同一个资源类 //使用 Lambda表达式 优化,不过为了思路不乱、清晰 // 最好先用匿名内部类写个例子,再变换 new Thread(()->{ for (int i = 1; i <= 30; i++) ticket.sale();},"Thread_A").start(); new Thread(()->{ for (int i = 1; i <= 30; i++) ticket.sale();},"Thread_B").start(); new Thread(()->{ for (int i = 1; i <= 30; i++) ticket.sale();},"Thread_C").start(); }}//1.1 资源类//需要做到高内聚,就要把对自己的操作的方法、把对外提供的功能放在自己身上class Ticket01 { private int number = 30; //不使用 synchronized ,因为加上 synchronized 的方法总所有代码都会被加锁 //改用 lock 接口及其实现类 ReentrantLock(可重入锁),来优化 private Lock lock = new ReentrantLock(); //资源类,自带了对外提供的功能 public void sale() { // lock 模块 // 上锁 lock.lock(); try { //售票的业务逻辑 if (number > 0) { System.out.println(Thread.currentThread().getName() + " 卖出第:" + (number--) + "票,还剩下:" + number + "张"); } }catch (Exception e){ e.printStackTrace(); }finally { // 开锁 lock.unlock(); } }}
Lambda表达式,只能在实例化接口的时候,并且该接口中有且仅有一个方法的时候使用
使用时的口诀: 拷贝小括号,写死右箭头,落地大括号
以上述模板为例
// 起初初始化new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 30; i++){ ticket.sale(); } }},"Thread_A").start();// 使用 Lambda表达式new Thread(()->{ for (int i = 1; i <= 30; i++) ticket.sale();},"Thread_A").start();
// 接口@FunctionalInterfaceinterface FUN{ public int sum(int X, int Y); default int sum2(int X, int Y){ return X + Y; }}
调用(需要使用该接口的实例对象才能调用)
//调用FUN f = new FUN();f.sum2(1,2);
// 接口@FunctionalInterfaceinterface FUN{ public int sum(int X, int Y); public static int sum2(int X, int Y){ return X + Y; }}
调用(只能使用该接口名才能调用)
//调用FUN.sum2(1,2);
转载地址:http://uklez.baihongyu.com/