大家来探讨一下 Java 方法执行问题! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xhf1024
V2EX    Java

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

  •  
  •   xhf1024 2020-05-07 16:31:32 +08:00 4133 次点击
    这是一个创建于 1981 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    生产者消费者模型?
    luozic
        30
    luozic  
       2020-05-08 09:08:28 +08:00
    生产者消费者模型,但是任务加了限定策略:任务是分包的,要么是现在包里持有的单个任务,要么是任务包(用队列打包成批处理)一次执行。
    异步+队列,这个不就是典型的执行 hold,再继续?
    实际用锁也行。
    Aresxue
        31
    Aresxue  
       2020-05-08 10:06:40 +08:00
    最简单的就是锁喽, 比较适合单机情况。单机下还可以使用 LinkedBlockingQueue 、线程池(其实也是 LinkedBlockingQueue)等 juc 下的并发容器处理
    分布式下可以考虑用消息队列, 前提是本身系统已经引入了一种消息队列, 不然额外引入一种消息队列的成本还有待商榷
    想要轻量级就用个分布式锁,实现方式最好也与当前中间件结合,有 zk 用 zk,有 redis 用 redis, 啥都没有就用数据库或者文件去做
    kongch
        32
    kongch  
       2020-05-08 10:28:08 +08:00
    第一个进去的初始化一个全局的 volatile 的 countdownlatch 到 100,然后 await,接下来进去的每次调用 countdown 一下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5671 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 06:31 PVG 14:31 LAX 23:31 JFK 02:31
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86