• JUC--Callable 以及Lock同步锁


    /**
     * 一、创建执行线程的方式三:实现Callable接口。相较于实现Runnable接口方式,方法可以有返回值,并且可以抛出异常
     * 二、callable 需要FutureTask实现类的支持。用于接受运算结果。FutureTask是Future接口的实现类。
     *
     * 线程执行完之后才会执行result.get 可以当做闭锁看
     */
    
    public class TestCallable {
    
        public static void main(String[] args) {
            ThreadDemo td = new ThreadDemo();
            FutureTask<Integer> result = new FutureTask<>(td);
            new Thread(result).start();
            //接受thread运算后的结构
    
            try {
              Integer sum=  result.get();
                System.out.println(sum);
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
    
    
        }
    
    }
    
    class ThreadDemo implements Callable<Integer> {
    
    
        @Override
        public Integer call() throws Exception {
            int sum=0;
            for(int i=0;i<=100;i++){
                sum+=i;
            }
            return sum;
        }
    }

    Lock:同步锁 

      用于解决多线程安全问题的方式:

        1 同步代码块

        2 不同方法

        3 同步锁(更加灵活的方式)

    /**
     * 显示的锁  使用lock方法上锁 并且使用unlock方法解锁
     * 要在方法中上锁和释放锁 方法必须执行 所以一般使用finally来释放锁
     */
    
    public class TestLock {
    
        public static void main(String[] args) {
            Ticket ticket  = new Ticket();
            new Thread(ticket,"win 1").start();
            new Thread(ticket,"win 2").start();
            new Thread(ticket,"win 3").start();
    
    
    
    
        }
    
    
    
    
    }
    class Ticket implements Runnable{
        private int tick=100;
        Lock lock = new ReentrantLock();
    
        @Override
        public void run() {
            while(true){
                lock.lock();
                try{
                    if(tick>0){
                        try {
                            Thread.sleep(200);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()+"完成售票,余票为:"+--tick);
    
                    }
    
                }finally {
                    lock.unlock();
                }
    
    
            }
    
        }
    }

    ReentrantLock是Lock的实现类

    在finally中调用lock.unlock

  • 相关阅读:
    OC动态特性
    app之间的互相跳转
    将服务器返回的URL或者网址截取出来特定的字符,然后将字符返回,一般根据返回的字符判断用户是否登录等即时状态
    网络请求的封装
    代理传值
    sql脚本查询日期时间段日期
    SQL >日期函数
    Sql 中text类型字段判断是否为空
    修复IE9.0下PlaceHolder 属性问题js脚本
    迅雷专用下载的几种代码
  • 原文地址:https://www.cnblogs.com/zhy-study/p/9404526.html
Copyright © 2020-2023  润新知