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

    }
    }
  • 相关阅读:
    在docker中执行linux shell命令
    ASP.NET MVC Controller接收ajax post方式发送过来的json对象或数组数据
    EasyUI 1.4.4 DataGrid(大数据量) bufferview滚动时不加载下一页数据解决方案
    MVC 5 下,应用log4net收集异常信息
    ASP.NET 获取IP信息等探针
    Discuz!NT 3.5.2正式版与Asp.net网站会员信息整合
    打印HTML页面部分区域javascript代码
    微网站之浅见
    从客户端检测到危险的Request.Form值解决方案
    Ajax客户登陆验证
  • 原文地址:https://www.cnblogs.com/lc0605/p/11738163.html
Copyright © 2011-2022 走看看