一. JUC

JUC

1. 什么是JUC?

java.util.concurrent在并发编程中使用的工具类

2. 什么是进程/线程?

进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。

3. 什么是并发/并行?

并发:同一时刻多个线程在访问同一个资源,多个线程对一个点

并行:多项工作一起执行,之后再汇总
   例子:泡方便面,电水壶烧水,一边撕调料倒入桶中

4. 卖票例子

/*
题目:三个售票员 卖出 30张票
	多线程编码套路+模板
	1. 在高内聚低耦合的前提下,线程 操作(对外暴露的调用方法) 资源类
	2. 
*/
class Ticket { //资源类
    private int number = 30;
    private Lock lock =  new ReentrantLock();

    public void saleTicket() { //操作

        lock.lock();
        try{
            if (number > 0) {
                System.out.println(Thread.currentThread().getName() + "\t卖出第:" + (number--) + "\t还剩下:" + number);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            lock.unlock();
        }
    }
}

public class SaleTicket {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 40; i++) {
                    ticket.saleTicket();
                }
            }
        }, "A").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 40; i++) {
                    ticket.saleTicket();
                }
            }
        }, "B").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 40; i++) {
                    ticket.saleTicket();
                }
            }
        }, "C").start();
    }
}
//输出
A	卖出第:30	还剩下:29
C	卖出第:29	还剩下:28
C	卖出第:28	还剩下:27
C	卖出第:27	还剩下:26
C	卖出第:26	还剩下:25
C	卖出第:25	还剩下:24
C	卖出第:24	还剩下:23
C	卖出第:23	还剩下:22
C	卖出第:22	还剩下:21
C	卖出第:21	还剩下:20
C	卖出第:20	还剩下:19
C	卖出第:19	还剩下:18
C	卖出第:18	还剩下:17
C	卖出第:17	还剩下:16
C	卖出第:16	还剩下:15
C	卖出第:15	还剩下:14
C	卖出第:14	还剩下:13
C	卖出第:13	还剩下:12
C	卖出第:12	还剩下:11
C	卖出第:11	还剩下:10
C	卖出第:10	还剩下:9
C	卖出第:9	还剩下:8
C	卖出第:8	还剩下:7
B	卖出第:7	还剩下:6
B	卖出第:6	还剩下:5
B	卖出第:5	还剩下:4
B	卖出第:4	还剩下:3
B	卖出第:3	还剩下:2
B	卖出第:2	还剩下:1
B	卖出第:1	还剩下:0
//lambda
class Ticket { //资源类
    private int number = 30;
    private Lock lock =  new ReentrantLock();

    public void saleTicket() { //操作

        lock.lock();
        try{
            if (number > 0) {
                System.out.println(Thread.currentThread().getName() + "\t卖出第:" + (number--) + "\t还剩下:" + number);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            lock.unlock();
        }
    }
}

public class SaleTicket {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(()->{for(int i=1; i<=40; i++) ticket.saleTicket();},"A").start();
        new Thread(()->{for(int i=1; i<=40; i++) ticket.saleTicket();},"B").start();
        new Thread(()->{for(int i=1; i<=40; i++) ticket.saleTicket();},"C").start();
    }
}

5. wait/sleep

功能都是当前线程暂停,有什么区别?
    wait放开手去睡,放开手里的锁
   sleep握紧手去睡,醒了手里还有锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值