zoukankan      html  css  js  c++  java
  • JUC

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

    一、进程/线程是什么?

      进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。

      线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。

          使用QQ,查看进程一定有一个QQ.exe的进程,我可以用qq和A文字聊天,和B视频聊天,给C传文件,给D发一段语言,QQ支持录入信息的搜索

     

    二、多线程卖票

    售票   三个售票员  卖出  30张票
    在高内聚低耦合的情况下 线程 操作 资源类

    (1)传统 synchronized 锁方法
    //资源类
    class
    Ticket { private int num = 30;
      //卖出票 操作方法
    public synchronized void saleTicket() { if (num > 0) { System.out.println(Thread.currentThread().getName() + "卖出第" + (num--) + "张票,还剩下:" + num); } } } public class SaleTicket { public static void main(String[] args) { Ticket1 ticket = new Ticket1(); // Thread(Runnable target,String name) 匿名内部类 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(); } }
    (2)JUC Lock锁方法  
    ReentrantLock和synchronized比较详见https://www.cnblogs.com/takumicx/p/9338983.html#%E6%80%BB%E7%BB%93
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;

    /**
    * 资源类 使用lock锁
    */
    class Ticket1 {
    private int num = 30;

    //ReentrantLock是可重入的独占锁。比起synchronized功能更加丰富,支持公平锁实现,支持中断响应以及限时等待等等。可以配合一个或多个Condition条件方便的实现等待通知机制。
    private final Lock lock = new ReentrantLock(true);

    public void saleTicket() {

    lock.lock();
    try {
    if (num > 0) {
    System.out.println(Thread.currentThread().getName() + "卖出第" + (num--) + "张票,还剩下:" + num);
    }
    } finally {
    lock.unlock();
    }
    }
    }

    /**
    * 售票 三个售票员 卖出 30张票
    * <p>
    * 在高内聚低耦合的情况下 线程 操作 资源类
    */
    public class SaleTicket {
    public static void main(String[] args) {

    Ticket1 ticket = new Ticket1();


    // Thread(Runnable target,String name) 匿名内部类


    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();

    }
    }
  • 相关阅读:
    leetcode刷题-54螺旋矩阵
    leetcode刷题-53最大子序和
    leetcode刷题-52N皇后2
    leetcode刷题-51N皇后
    leetcode刷题-50Pow(x, n)
    leetcode刷题-37解数独
    leetcode刷题-49字母异位词分组
    leetcode刷题-48旋转图像
    数据结构—B树、B+树、B*树
    LeetCode–旋转数组的最小数字
  • 原文地址:https://www.cnblogs.com/lc0605/p/11738163.html
Copyright © 2011-2022 走看看