[讨论][探索]优雅的并发执行代码.

先看这段代码,java:

        int a = 1;//step 1
        int b = 一段执行10秒的方法();//step 2
        int c = 一段执行15秒的方法();//step 3
        int d = b + c;//step 4

在这里,第二步和第三步是不需要先后执行的,我希望它们可以同时执行,只要执行第4步之前第2,3步执行完就可以了.

那么,有什么好的解决办法呢?


再看go语言:

    resultChan:=make(chan int,2)
    go 耗时方法(values[:len(values)/2],resultChan)
    go 耗时方法(values[len(values)/2:],resultChan)
    sum1,sum2:=<-resultChan,<-resultChan

这个解决方案挺好的!

再回到java语言中,修改后的代码:

    static int b;//step 2.1
    static int c;//step 3.1

    private static int aMethod() throws InterruptedException {
        int a = 1;//step 1


        Thread t1 = new Thread(() -> b = 一段执行10秒的方法());//step 2.2
        t1.start();//step 2.3
        
        Thread t2 = new Thread(() -> c = 一段执行15秒的方法());//step 3.2
        t2.start();//step 3.3

        t1.join();//step 2.4
        t2.join();//step 3.4

        int d = b + c;//step 4
        return d;//step 5
    }

虽然代码长的太丑了,但是好在功能实现了,LOL.

groovy语言的代码:

int 一段执行10秒的方法() { loop(10); 2 }

int 一段执行15秒的方法() { loop(15); 3 }

def loop(int times) {
    times.times {
        Thread.sleep(1000)
        println "loop $it"
    }
}

def threads = []
def results = []
threads << Thread.start { results << 一段执行10秒的方法() }
threads << Thread.start { results << 一段执行15秒的方法() }

threads*.join()
println results.sum()


最后,实际运行时go语言开销最好,因为go语言就是协程,而java,groovy用的线程.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值