有人说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;
}
}
}
}