当前位置: 首页 > news >正文

温州正规制作网站公司软件工程师发展前景

温州正规制作网站公司,软件工程师发展前景,成品门户网站源码免费,邯郸品牌商标vi设计策划公司文章目录 什么是JUC?Callable接口ReentrantLockReentrantLock VS synchronized 原子类线程池信号量SemaphoreCountDownLatch 什么是JUC? JUC是:java.util.concurrent这个包名的缩写。它里面包含了与并发相关,即与多线程相关的很多…

文章目录

  • 什么是JUC?
  • Callable接口
  • ReentrantLock
    • ReentrantLock VS synchronized
  • 原子类
  • 线程池
  • 信号量Semaphore
  • CountDownLatch

什么是JUC?

JUC是:java.util.concurrent这个包名的缩写。它里面包含了与并发相关,即与多线程相关的很多东西。我们下面就来介绍这些东西。

Callable接口

Callable接口类似与Runnable接口:
Runnable接口:描述的任务是不带返回值的。
callable接口:描述的任务是带返回值的,存在的意义就是让我们获取到结果
让我们通过下面的代码来仔细体会一下不同

    // 使用Runnable来计算 1+2+.....+1000static class Result{public int sum;public Object locker = new Object();}public static void main(String[] args) {Result result = new Result();//创建一个专门的线程来求和Thread thread = new Thread(){@Overridepublic void run() {for (int i = 0; i < 1000; i++){result.sum ++;}synchronized (result.locker){result.locker.notify();}}};thread.start();// 必须得等thread线程执行完了再打印synchronized (result.locker) {if (result.sum == 0){try {result.locker.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(result.sum);}}
    // 使用callable来计算1+2+....+1000public static void main(String[] args) {//使用callable来定义一个任务Callable<Integer> callable = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i < 1000; i++){sum++;}return sum;}};// 用来接受callable任务作为参数FutureTask<Integer> futureTask = new FutureTask<>(callable);//Thread 里的参数没有callable类型  只有futuretask类型  所以需要创建一个futuretask类型来过渡Thread thread = new Thread(futureTask);thread.start();try {System.out.println(futureTask.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}

ReentrantLock

ReentrantLock,也是可重入锁。它的出现是为了补充synchronized(可重入锁)无法实现的一些操作。

它一共有三个核心的方法:

  • tryLock:试试能不能加上锁,试成功了就加上锁;试失败了就放弃。还可以指定加锁的等待超时时间,超过时间则放弃加锁。
  • lock:加锁
  • unlock:解锁

ReentrantLock VS synchronized

  1. ReentrantLock必须手动调用lock()和unlock()方法,这样如果它们之间出现异常,unlock()方法就有可能调用不到,造成资源浪费。而synchronized则没有这个问题。
       public static void main(String[] args) {// 和synchronized相比有三个优势 两个不同ReentrantLock reentrantLock = new ReentrantLock();try {reentrantLock.lock();}finally {//当在 lock和unlock 之间出现异常时  unlock就无法执行到  需要用到finally来必须执行//synchronized不存在这个问题  因为它只要出了代码块就一定会解锁reentrantLock.unlock();}}
  1. ReentrantLock是标准库的一个类,底层是基于Java实现的;synchronized是Java关键字,底层是通过JVM实现的(C++实现的)
  2. tryLock可以尝试加锁并且指定加锁的等待超时时间;synchronized会一直死等。在实际开发中,往往不使用死等。
  3. ReentrantLock可以实现公平锁,通过指定构造方法里的一个参数;synchronized是非公平锁。
        ReentrantLock reentrantLock = new ReentrantLock(true);
  1. ReentrantLock是搭配Condition类实现通知唤醒操作的,唤醒操作可以指定唤醒哪一个线程;synchronized是搭配wait-notify实现通知唤醒操作的,唤醒操作是随机唤醒一个线程。

原子类

原子类的底层是基于CAS实现的,使用原子类最常见的场景就是多线程计数。
CAS操作前面已经非常详细的介绍过,点击此处可以查看浏览

     //原子类  多用于计数//count.getAndIncrement   =   count++//count.incrementAndGer   =   ++count//count.getAndDecrement   =   count--//count.decrementAndGer   =   --countpublic static void main(String[] args) {AtomicInteger count = new AtomicInteger();Thread thread = new Thread(() -> {for (int i = 0; i < 50000; i++){//相当与count++;count.getAndIncrement();}});Thread thread1 = new Thread(() -> {for (int i = 0; i < 50000; i++){//相当于count++;count.getAndIncrement();}});thread.start();thread1.start();try {thread.join();thread1.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(count.get());}

线程池

前面已经非常详细的介绍过,点击此处可以查看浏览

信号量Semaphore

信号量的基本操作有两个:
P操作:申请一个资源
V操作:释放一个资源

信号量本身是一个计数器,表示可用资源的个数:
P操作申请一个资源,可用资源的个数就-1
V操作释放一个资源,可用资源的个数就+1
当计数为0时,继续进行P操作就会阻塞,直到其他线程执行V操作释放资源

        // 信号量可以看成更广义的锁   锁就是一个信号量  可用资源数只有1public static void main(String[] args) throws InterruptedException {// 需要指定初始值 表示可用资源的个数Semaphore semaphore = new Semaphore(4);semaphore.acquire();System.out.println("申请资源");semaphore.acquire();System.out.println("申请资源");semaphore.acquire();System.out.println("申请资源");semaphore.release();System.out.println("释放资源");semaphore.release();System.out.println("释放资源");}

CountDownLatch

CountDownLatch使用的效果:类似于一个跑步比赛,当最后一个选手到达终点就结束。
使用CountDownLatch的时候,首先要设置一下有几个选手参赛,每个选手撞线了就调用一下countDown方法,当撞线次数达到选手的个数时,比赛就结束。

放到程序中理解:
比如:要下载一个很大的文件,把文件分成多部分分别下载。使用多线程执行下载任务,每个线程下载一部分,当所有的线程都下载完毕,整个线程就下载完毕了。

	//CountDownLatchpublic static void main(String[] args) {// 设置任务的个数CountDownLatch downLatch = new CountDownLatch(10);for (int i = 0; i < 10; i++){Thread thread = new Thread(() -> {System.out.println("开始任务" + Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("任务结束" + Thread.currentThread().getName());downLatch.countDown();});thread.start();}try {downLatch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("全部任务都结束");}
http://www.yayakq.cn/news/524008/

相关文章:

  • 上海闸北城市建设有限公司网站wordpress 平铺水印
  • php网站整合dz论坛哪些公司网站建设好
  • 一条龙网站建设哪家专业工作站
  • mixkitcom素材网站flutter 如何做网站
  • 网站首页被k怎么办曲靖做网站
  • 建设网站最重要的是什么意思网站建设改手机号
  • 想自己做网站推广如何注册域名网站
  • 北京网站建设设计公司浩森宇特怎么做免费网站被收录
  • 学网站开发哪个好如何做企业税收筹划
  • 导航特效网站深圳好的外贸网站建设
  • 建筑安全员证查询网上查询官网乐清seo公司
  • 广州的网站建设公司哪家好房价网查询官网
  • wordpress小成语网站优化 seo
  • 网站重定向怎么做公司网站建设一般多少钱
  • 提供网站建设管理足球网站开发
  • 做字的网站网页设计html模板下载
  • 网站开发部网站建站销售提成
  • 建设网站模块需要哪些内容wordpress查看用户
  • 做系统网站信息检索网站上海建设工程管理网站
  • 手机微信客户端网站建设信阳网站开发建设公司
  • 三里河网站建设公司网站是如何搭建的
  • 会计网站建设意义吉林百度查关键词排名
  • 上海羚凯网站建设用哪个做网站demo
  • 网站建设到本地wordpress 验证
  • 平度市建设部网站网络推广网
  • 百度是不是只有在自己的网站发布才会被收录网站优化建设山东
  • 建设银行嘉兴分行官方网站做网站别人点击能得钱吗
  • 在那个网站做ppt可以赚钱采集的网站怎么做收录
  • 网络网站建设电话推销WordPress建网盘
  • 深圳品牌网站推广公司定襄网站建设