zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Conda 中安装 Keras
    Clean Docker :
    Conservation Vs Non-conservation Forms of conservation Equations
    C语言之预处理命令
    const指针用法总结
    C语言中的小启发(陆续更新。。。)
    左值与右值
    计算的次序
    C语言中的符号重载
    C语言之switch语句详解
  • 原文地址:https://www.cnblogs.com/zhy-study/p/9404526.html
Copyright © 2011-2022 走看看