V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
xhf1024
V2EX  ›  Java

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

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

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

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

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