V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xhf1024
V2EX  ›  Java

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

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

    就是比如一个 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 Android
    单线程消费阻塞队列
    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
    实在看不懂你在说什么,建议先从三年级语文学起。
    oneisall8955
        29
    oneisall8955  
       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   ·   实用小工具   ·   5856 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:24 · PVG 10:24 · LAX 18:24 · JFK 21:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.