go语言比java高级在哪里

本文探讨了Go语言相对于Java的高级之处,主要体现在Go语言原生支持用户态的纤程(Goroutines)。虽然Java目前JDK14尚未原生支持,但可以通过第三方库Quasar实现类似功能。文章通过测试结果展示了纤程在多线程场景中的性能和使用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有人说go比较高级,无非是说go语言比java多了用户态的纤程。目前java原生jdk到了JDK14,还没有支持,不过我相信以后肯定会支持的。目前只能通过三方jar包(Quasar)的形式来支持。

那就提前感受下纤程的威力吧。话不多说,直接上测试结果,大家自行感受其威力!!!

1.多线程。

/**
 * @Auther Micky
 * @Date 2020-10-25 11:35
 * <p>
 * 4个cpu,8G内存, i7处理器,Windows10系统
 * 线程和纤程的区别
 * 先做单线程无纤程的。
 * cost time is 2056 ms
 * cost time is 3871 ms
 * cost time is 2878 ms
 * cost time is 3414 ms
 * cost time is 3462 ms
 */
public class ThreadOnlyTest {
    public static void main(String[] args) throws Exception {
        long startTime = System.currentTimeMillis();
        int size = 10000;
        CountDownLatch countDownLatch = new CountDownLatch(size);
        Thread[] ThreadArray = new Thread[size];
        for (int i = 0; i < ThreadArray.length; i++) {
            ThreadArray[i] = new Thread(() -> {
                calc();
                countDownLatch.countDown();
            });
        }
        for (int i = 0; i < ThreadArray.length; i++) {
            ThreadArray[i].start();
        }
        countDownLatch.await();
        System.out.println("cost time is " + (System.currentTimeMillis() - startTime) + " ms");

    }

    private static void calc() {
        int result = 0;
        for (int i = 0; i < 10000; i++) {
            for (int i1 = 0; i1 < 1000; i1++) {
                result += i1;
            }
        }
    }
}

 

2.一个线程,多纤程

package study.concurrent.fiber;

import co.paralleluniverse.fibers.Fiber;


/**
 * @Auther Micky
 * @Date 2020-10-25 11:35
 * 4个cpu,8G内存, i7处理器,Windows10系统
 * 线程和纤程的区别
 * 先做单线程多纤程的。
 * cost time is 419 ms
 * cost time is 472 ms
 * cost time is 416 ms
 * cost time is 625 ms
 * cost time is 426 ms
 */
public class OneThreadFibersTest {
    public static void main(String[] args) throws Exception {
        long startTime = System.currentTimeMillis();
        int size = 10000;
        Fiber<Void>[] fiberArray = new Fiber[size];

        for (int i = 0; i < fiberArray.length; i++) {
            fiberArray[i] = new Fiber<>(() -> calc());
        }

        for (int i = 0; i < fiberArray.length; i++) {
            fiberArray[i].start();
        }

        for (int i = 0; i < fiberArray.length; i++) {
            fiberArray[i].join();
        }

        System.out.println("cost time is " + (System.currentTimeMillis() - startTime) + " ms");

    }

    private static void calc() {
        int result = 0;
        for (int i = 0; i < 10000; i++) {
            for (int i1 = 0; i1 < 1000; i1++) {
                result += i1;
            }
        }
    }
}

 

3.多线程+多纤程

 

package study.concurrent.fiber;

import co.paralleluniverse.fibers.Fiber;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;


/**
 * @Auther Micky
 * @Date 2020-10-25 11:35
 * 4个cpu,8G内存, i7处理器,Windows10系统
 * 线程和纤程的区别
 * 先做多线程多纤程的。
 * <p>
 *cost time is 347 ms
 *cost time is 402 ms
 *cost time is 394 ms
 *cost time is 364 ms
 *cost time is 348 ms
 *
 */
public class TenThreadFibersTest002 {
    public static void main(String[] args) throws Exception {
        long startTime = System.currentTimeMillis();
        int threadSize = 10;
        CountDownLatch countDownLatch = new CountDownLatch(threadSize);
        Thread[] ThreadArray = new Thread[threadSize];
        List<Fiber> fiberList = new ArrayList<>();
        for (int i = 0; i < ThreadArray.length; i++) {
            ThreadArray[i] = new Thread(() -> {
                try {
                    fiberList.addAll(doStartFiber());
                    countDownLatch.countDown();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
        for (int i = 0; i < ThreadArray.length; i++) {
            ThreadArray[i].start();
        }

        countDownLatch.await();//保证所有的都启动完
        for (int i = 0; i < fiberList.size(); i++) {
            fiberList.get(i).join();//保证所有的纤程都执行完
        }
        System.out.println("cost time is " + (System.currentTimeMillis() - startTime) + " ms");

    }

    private static List<Fiber> doStartFiber() throws Exception {
        Fiber<Void>[] fiberArray = new Fiber[1000];
        for (int i = 0; i < fiberArray.length; i++) {
            fiberArray[i] = new Fiber<>(() -> calc());
        }
        for (int i = 0; i < fiberArray.length; i++) {
            fiberArray[i].start();
        }
        return Arrays.asList(fiberArray);
    }

    private static void calc() {
        int result = 0;
        for (int i = 0; i < 10000; i++) {
            for (int i1 = 0; i1 < 1000; i1++) {
                result += i1;
            }
        }
    }
}

 

4.多线程+多纤程002 :这种好像不对。没有执行完,就打印时间了。join还是不靠谱的。

package study.concurrent.fiber;

import co.paralleluniverse.fibers.Fiber;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


/**
 * @Auther Micky
 * @Date 2020-10-25 11:35
 * 4个cpu,8G内存, i7处理器,Windows10系统
 * 线程和纤程的区别
 * 先做多线程多纤程的。
 * <p>
 *cost time is 66 ms
 *cost time is 103 ms
 *cost time is 83 ms
 * cost time is 80 ms
 * cost time is 69 ms
 * cost time is 62 ms
 *
 */
public class TenThreadFibersTest002 {
    public static void main(String[] args) throws Exception {
        long startTime = System.currentTimeMillis();
        int threadSize = 10;
        Thread[] ThreadArray = new Thread[threadSize];
        List<Fiber> fiberList = new ArrayList<>();
        for (int i = 0; i < ThreadArray.length; i++) {
            ThreadArray[i] = new Thread(() -> {
                try {
                    fiberList.addAll(doStartFiber());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
        for (int i = 0; i < ThreadArray.length; i++) {
            ThreadArray[i].start();
        }
        for (int i = 0; i < fiberList.size(); i++) {
            fiberList.get(i).join();
        }
        System.out.println("cost time is " + (System.currentTimeMillis() - startTime) + " ms");

    }

    private static List<Fiber> doStartFiber() throws Exception {
        Fiber<Void>[] fiberArray = new Fiber[1000];
        for (int i = 0; i < fiberArray.length; i++) {
            fiberArray[i] = new Fiber<>(() -> calc());
        }
        for (int i = 0; i < fiberArray.length; i++) {
            fiberArray[i].start();
        }
        return Arrays.asList(fiberArray);
    }

    private static void calc() {
        int result = 0;
        for (int i = 0; i < 10000; i++) {
            for (int i1 = 0; i1 < 1000; i1++) {
                result += i1;
            }
        }
    }
}

 

 

上一级->新技术篇

首页->目录大纲

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值