zoukankan      html  css  js  c++  java
  • java之JUC

    java的JUC即java.util.concurrent包,这是一个处理线程的工具包。

    一、synchronized与lock锁 两者区别?

    1.synchronized是java关键字,lock是一个类;
    2.Synchronized无法判断获取锁的状态,Lock可以判断是否获取到了锁;
    3.Synchronized会自动释放锁,而lock需要手动释放锁,否则会造成死锁;
    4.Synchronized 线程1(获得锁,阻塞)线程2(等待,傻傻的等),Lock锁不一定会等待下去;
    5.Synchronized是可重入锁,非公平不可中断,Lock是可重入锁,非公平(可自定义),可以判断锁(lock.tryLock())
    6.Synchronized适合少量代码同步问题,Lock适合大量的同步代码。

    二、wait和sleep的区别?

    1.wait在object类中
    sleep在Thread类中
    2.wait会释放锁
    sleep不会释放锁
    3.使用范围
    wait必须使用在同步代码块中,
    sleep可以在任何地方使用。

    三、线程的几种状态

    新生
    运行
    阻塞
    等待
    超时等待
    终止

    四、condition精准唤起线程

    public class A {
        public static void main(String[] args) {
            Data3 data3 = new Data3();
            new Thread(()->{
                for(int i = 0;i<10;i++){
                    data3.printA();
                }
            }).start();
            new Thread(()->{
                for(int i = 0;i<10;i++){
                    data3.printB();
                }
            }).start();
            new Thread(()->{
                for(int i = 0;i<10;i++){
                    data3.printC();
                }
            }).start();
        }
    
    
    }
    class Data3{
        private Lock lock1 = new ReentrantLock();
        Condition condition = lock1.newCondition();
        Condition condition2 = lock1.newCondition();
        Condition condition3 = lock1.newCondition();
        private int num = -1;
        public void printA(){
            lock1.lock();
            try {
                while (num!=-1){
                    condition.await();
                }
                num = 0;
                System.out.println(Thread.currentThread().getName()+"AAAAAAAAA");
                condition2.signal();
            }catch (Exception e){
    
            }finally {
                lock1.unlock();
            }
    
        }
        public void printB(){
            lock1.lock();
            try{
                while (num!=0){
                    condition2.await();
                }
                num = 1;
                System.out.println(Thread.currentThread().getName()+"BBBBBBBBB");
                condition3.signal();
            }catch (Exception e){
    
            }finally {
                lock1.unlock();
            }
        }
        public void printC(){
            lock1.lock();
            try{
                while (num!=1){
                    condition3.await();
                }
                num = -1;
                System.out.println(Thread.currentThread().getName()+"CCCCCCCCCCC");
                condition.signal();
            }catch (Exception e){
    
            }finally {
                lock1.unlock();
            }
        }
    }

    五.callable与runnable方法的区别:

    1.callable有返回值;
    2.callable可以抛出异常;
    3.方法不同,run()/call()

    public class CallableTest {
        public static void main(String[] args) throws Exception{
            MyCallable myCallable = new MyCallable();
            FutureTask futureTask = new FutureTask(myCallable);
            new Thread(futureTask,"threadA").start();
            Integer i = (Integer) futureTask.get();//get方法可能会产生阻塞,把该方法放到最后执行 或者使用异步方法来执行
            System.out.println(i);
        }
    }
    class MyCallable implements Callable<Integer>{
        @Override
        public Integer call() throws Exception {
            System.out.println("call方法执行!!!");
            return 100;
        }
    }

    六、常用的辅助类

    1.countdownLaunch(减法计数器)
    countdownLaunch.countDown(); //数量-1
    countdownLaunch.await();//等待计数器归零,然后再向下执行
    2.cyclicBarrier(加法计数器)
    3.semaphore
    Semaphore.acquire()获得,如果已经满了,等待,等待被释放为止
    Semaphore.release()释放,会将当前的信号量释放+1,然后唤醒等待线程
    作用:多个共享资源互斥的使用,并发限流,控制最大的线程数。

    public class CountdownlaunchTest {
        public static void main(String[] args)throws Exception {
            //总数是6
            CountDownLatch countDownLatch = new CountDownLatch(6);
            for(int i = 0;i<6;i++){
                new Thread(()->{
                    System.out.println(Thread.currentThread().getName()+"go");
                    countDownLatch.countDown(); //数量-1
                }, String.valueOf(i)).start();
            }
            countDownLatch.await();
            System.out.println("---------------------");
        }
    }
    public class CyclicBarrierTest {
        public static void main(String[] args)throws Exception {
            CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
                System.out.println("第7个线程");
            });
            for(int i = 0;i<7;i++){
                int s = i;
                new Thread(()->{
                    System.out.println(Thread.currentThread().getName()+"go");
                    try{
                        System.out.println(s);
                        cyclicBarrier.await();
                    }catch (Exception e){
    
                    }
                },String.valueOf(i)).start();
            }
        }
    }
    public class SeamphoreTest {
        public static void main(String[] args) throws Exception{
            Semaphore semaphore = new Semaphore(3);
            for(int i = 0;i<6;i++){
                new Thread(()->{
                    try {
                        semaphore.acquire();
                        System.out.println(Thread.currentThread().getName()+"获得停车位");
                        TimeUnit.SECONDS.sleep(2);
                        System.out.println(Thread.currentThread().getName()+"离开停车位");
                    }catch (Exception e){
    
                    }finally {
                        semaphore.release();
                    }
    
                },String.valueOf(i)).start();
            }
        }
    }

    七、线程池

    线程池:7大参数、4种拒绝策略

    自定义线程池:

    public class ExecutorsTest {
        public static void main(String[] args) {
            BlockingQueue<Runnable> blockingQueue = new ArrayBlockingQueue<Runnable>(3);
            RejectedExecutionHandler abortPolicy = new ThreadPoolExecutor.AbortPolicy();
            ThreadPoolExecutor.DiscardPolicy discardPolicy = new ThreadPoolExecutor.DiscardPolicy();
            ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3,5,
                    2L, TimeUnit.SECONDS, blockingQueue,Executors.defaultThreadFactory(),discardPolicy);
            for (int i = 0;i<9;i++){
                final int n = i;
                threadPoolExecutor.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"执行任务");
                });
            }
            threadPoolExecutor.shutdown();
        }
    }
     public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue<Runnable> workQueue,
                                  ThreadFactory threadFactory,
                                  RejectedExecutionHandler handler) 

     四种线程池:newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduleThreadPool

  • 相关阅读:
    ubuntu14.04显卡驱动问题(amd5600k集显7650d)
    win7 ubuntu 14.04双系统安装
    func_num_args, func_get_arg, func_get-args 的区别与用法
    wamp2.5版本64位403forbidden问题
    mysql根据汉字拼音排序查询
    php判断浏览器语言
    php批量下载文件
    php搜索分页
    把ZenCart在线商店搭建到本地
    livezilla账号或密码修改方法
  • 原文地址:https://www.cnblogs.com/menbo/p/10590306.html
Copyright © 2011-2022 走看看