xhf1024
V2EX  ›  Java

大家来探讨一下 Java 方法执行问题!

  •  
  •   xhf1024 · May 7, 2020 · 5046 views
    This topic created in 2377 days ago, the information mentioned may be changed or developed.

    就是比如一个 a 方法,会执行很多遍,第一次执行的时候执行完的时候,期间有 100 个执行了 a 方法,现在又什么方法就是第一次执行完 a 方法,期间 100 次就等着,等第一次 a 方法执行完然后再执行一次?就好比送快递的,我手里拿一个快递,那我执行送快递这个操作,我送的期间快递站有络绎不绝的快递送到服务站等着我送,等我送完之后回来,我再拿起所有的快递去实行送快递这个操作,而不是有一个快递就得派一个人送。

    32 replies  •  2020-05-08 10:28:08 +08:00
    xhf1024
    xhf1024
    OP
    May 7, 2020
    1
    送快递这个操作==执行 a 方法
    6IbA2bj5ip3tK49j
    6IbA2bj5ip3tK49j
    May 7, 2020
    2
    锁
    superJava
    superJava
    May 7, 2020
    3
    队列
    evoluc97
    evoluc97
    May 7, 2020
    4
    单机 synchronized ReentrantLock
    分布式 上分布式锁
    KentY
    KentY
    May 7, 2020
    5
    典型的 use case of synchronized method?
    victooory
    victooory
    May 7, 2020
    6
    Thread Join()
    cookii
    cookii
    May 7, 2020
    7
    Executors.newSingleThreadExecutor(),这个有 oom 风险,也可以自己设定队列最大数量
    singerll
    singerll
    May 7, 2020 via Android
    8
    程序不太懂,但这个是不是单片机原理里面讲的中断。。。
    duwan
    duwan
    May 7, 2020
    9
    这不就是只有一个生产者的生产者消费者问题吗。
    MisakaTang
    MisakaTang
    May 7, 2020
    10
    服务站(缓存) 拿起所有的快递(批处理)
    luckyrayyy
    luckyrayyy
    May 7, 2020
    11
    单线程任务队列?
    duwan
    duwan
    May 7, 2020
    12
    说错了 只有一个消费者的生产者消费者问题
    Hanggi
    Hanggi
    May 7, 2020
    13
    换 go 语言,逃
    teawithlife
    teawithlife
    May 7, 2020
    14
    没用过 java,不知道是否有高级的办法。纯手撸的话,就是用一个 FIFO 队列。
    chibupang
    chibupang
    May 7, 2020 via iPhone
    16
    CountDownLatch 了解一下
    soulzz
    soulzz
    May 7, 2020
    17
    我上面的代码好像没有概括清楚
    接收快递装箱定义为一个单独的线程或很多线程,把待发的件收集到一个 list 中,list 到了一定大小后调用派件任务
    freebird1994
    freebird1994
    May 7, 2020
    18
    多对一的生产消费模型?
    guyeu
    guyeu
    May 7, 2020❤️5
    19
    实在没看明白楼主在讲什么。。楼上大佬们好像都看懂了,谁能不能给翻译一下。。
    Aynamic
    Aynamic
    May 7, 2020 via Android
    20
    @guyeu 我也不知道楼主讲什么
    zzkde
    zzkde
    May 7, 2020
    21
    CountDownLatch 或者 CyclicBarrier ?
    Aruforce
    Aruforce
    May 7, 2020 via Android
    22
    看你的意思是在第一次任务执行后,由一个线程 batch 执行在第一次任务执行间提交的批量任务?

    如果是这样的话,无法做到,因为一个线程在任意时刻执行一个方法…

    如果理解错误的话,当我没说……
    gaius
    gaius
    May 7, 2020 via Android
    23
    单线程消费阻塞队列
    719465553
    719465553
    May 7, 2020
    24
    怀疑没用过锁
    Devin
    Devin
    May 7, 2020 via Android
    25
    给 a 方法加个锁,谁拿到谁执行,其他的等待。如果需要顺序,就只能队列
    yungo8
    yungo8
    May 7, 2020 via Android
    26
    感觉 22 楼翻译的对。
    但我不知道是不是无法做到。
    下一位
    keenkiller
    keenkiller
    May 8, 2020 via Android
    27
    这就是普通的多生产单一消费吧?生产者把东西塞队列里,消费者一次性把队列清空…
    kmyzzy
    kmyzzy
    May 8, 2020
    28
    实在看不懂你在说什么,建议先从三年级语文学起。
    itechify
    itechify
    May 8, 2020 via Android
    29
    楼主的问题是这样?最开始,快递员等了一段时间,只有一个快递(需要执行方法 A 的次数),于是,送了这个快递(执行方法 A ),在送这个快递这个期间,快递站收到了很多快递(收到很多方法 A ???),快递员送完第一个快递,回头一看,有那么多快递,这次就一次性送完(执行多次方法 A )。

    生产者消费者模型?
    luozic
    luozic
    May 8, 2020
    30
    生产者消费者模型,但是任务加了限定策略:任务是分包的,要么是现在包里持有的单个任务,要么是任务包(用队列打包成批处理)一次执行。
    异步+队列,这个不就是典型的执行 hold,再继续?
    实际用锁也行。
    Aresxue
    Aresxue
    May 8, 2020
    31
    最简单的就是锁喽, 比较适合单机情况。单机下还可以使用 LinkedBlockingQueue 、线程池(其实也是 LinkedBlockingQueue)等 juc 下的并发容器处理
    分布式下可以考虑用消息队列, 前提是本身系统已经引入了一种消息队列, 不然额外引入一种消息队列的成本还有待商榷
    想要轻量级就用个分布式锁,实现方式最好也与当前中间件结合,有 zk 用 zk,有 redis 用 redis, 啥都没有就用数据库或者文件去做
    kongch
    kongch
    May 8, 2020
    32
    第一个进去的初始化一个全局的 volatile 的 countdownlatch 到 100,然后 await,接下来进去的每次调用 countdown 一下
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2797 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 76ms · UTC 05:17 · PVG 13:17 · LAX 21:17 · JFK 00:17
    ♥ Do have faith in what you're doing.