在B站上看了一个视频,讲了协程和线程在运行机制上有一些不同,线程运行中会因为操作系统的调度而失去时间片,协程运行过程中是不会受到影响的,除非协程的业务代码主动让出CPU执行权或者遇到io阻塞,接下来用线程和协程实现同样功能来对比一下两者之间的区别,线程的代码我用java写,但是运行结果出乎我的意料,恰恰相反,多线程版本的执行完一个线程再执行下一个,而多个协程是交错执行的,我是见了鬼吗?
一.java多线程版本
1.代码
/**
* @ClassName: ThreadTest
* @description: 多线程测试
* @author: leijing
* @Date: 2019/4/20 下午10:04
* @Version: 1.0
*/
public class ThreadTest {
public static void main(String[] args) {
new Thread(new Task("task1")).run();
new Thread(new Task("task2")).run();
}
}
class Task extends Thread {
private String name;
public Task(String name){
this.name = name;
}
@Override
public void run() {
for (int i = 0 ; i < 100; i++){
System.out.println(name+" "+i);
}
}
}
2.运行结果
task1 0
task1 1
task1 2
task1 3
task1 4
task1 5
task1 6
task1 7
task1 8
task1 9
task1 10
task1 11
task1 12
task1 13
task1 14
task1 15
task1 16
task1 17
task1 18
task1 19
task1 20
task1 21
task1 22
task1 23
task1 24
task1 25
task1 26
task1 27
task1 28
task1 29
task1 30
task1 31
task1 32
task1 33
task1 34
task1 35
task1 36
task1 37
task1 38
task1 39
task1 40
task1 41
task1 42
task1 43
task1 44
task1 45
task1 46
task1 47
task1 48
task1 49
task1 50
task1 51
task1 52
task1 53
task1 54
task1 55
task1 56
task1 57
task1 58
task1 59
task1 60
task1 61
task1 62
task1 63
task1 64
task1 65
task1 66
task1 67
task1 68
task1 69
task1 70
task1 71
task1 72
task1 73
task1 74
task1 75
task1 76
task1 77
task1 78
task1 79
task1 80
task1 81
task1 82
task1 83
task1 84
task1 85
task1 86
task1 87
task1 88
task1 89
task1 90
task1 91
task1 92
task1 93
task1 94
task1 95
task1 96
task1 97
task1 98
task1 99
task2 0
task2 1
task2 2
task2 3
task2 4
task2 5
task2 6
task2 7
task2 8
task2 9
task2 10
task2 11
task2 12
task2 13
task2 14
task2 15
task2 16
task2 17
task2 18
task2 19
task2 20
task2 21
task2 22
task2 23
task2 24
task2 25
task2 26
task2 27
task2 28
task2 29
task2 30
task2 31
task2 32
task2 33
task2 34
task2 35
task2 36
task2 37
task2 38
task2 39
task2 40
task2 41
task2 42
task2 43
task2 44
task2 45
task2 46
task2 47
task2 48
task2 49
task2 50
task2 51
task2 52
task2 53
task2 54
task2 55
task2 56
task2 57
task2 58
task2 59
task2 60
task2 61
task2 62
task2 63
task2 64
task2 65
task2 66
task2 67
task2 68
task2 69
task2 70
task2 71
task2 72
task2 73
task2 74
task2 75
task2 76
task2 77
task2 78
task2 79
task2 80
task2 81
task2 82
task2 83
task2 84
task2 85
task2 86
task2 87
task2 88
task2 89
task2 90
task2 91
task2 92
task2 93
task2 94
task2 95
task2 96
task2 97
task2 98
task2 99
二.go多协程版本
1.代码
package main
import "fmt"
import "time"
func task(name string) {
for i := 0; i < 100; i++ {
fmt.Printf("%s %d\n", name, i)
}
}
func main() {
go task("task1")
go task("task2")
time.Sleep(time.Second)
}
2.运行结果
task2 0
task2 1
task1 0
task2 2
task2 3
task2 4
task2 5
task2 6
task2 7
task1 1
task1 2
task1 3
task1 4
task1 5
task2 8
task2 9
task2 10
task2 11
task2 12
task2 13
task2 14
task2 15
task2 16
task2 17
task2 18
task2 19
task2 20
task2 21
task2 22
task2 23
task2 24
task2 25
task2 26
task2 27
task2 28
task2 29
task2 30
task1 6
task1 7
task1 8
task2 31
task2 32
task2 33
task1 9
task1 10
task1 11
task2 34
task2 35
task2 36
task1 12
task1 13
task1 14
task1 15
task1 16
task1 17
task1 18
task1 19
task1 20
task1 21
task1 22
task2 37
task1 23
task1 24
task1 25
task1 26
task1 27
task1 28
task1 29
task1 30
task1 31
task1 32
task1 33
task1 34
task1 35
task1 36
task1 37
task1 38
task1 39
task1 40
task1 41
task1 42
task1 43
task1 44
task1 45
task1 46
task1 47
task2 38
task2 39
task2 40
task2 41
task2 42
task2 43
task2 44
task2 45
task2 46
task1 48
task1 49
task1 50
task1 51
task1 52
task1 53
task1 54
task1 55
task2 47
task1 56
task1 57
task1 58
task1 59
task1 60
task1 61
task1 62
task1 63
task2 48
task2 49
task1 64
task1 65
task1 66
task1 67
task1 68
task1 69
task1 70
task1 71
task1 72
task2 50
task2 51
task2 52
task2 53
task2 54
task2 55
task2 56
task2 57
task2 58
task2 59
task2 60
task1 73
task1 74
task2 61
task2 62
task2 63
task1 75
task1 76
task1 77
task1 78
task2 64
task2 65
task2 66
task2 67
task2 68
task2 69
task2 70
task2 71
task2 72
task2 73
task2 74
task2 75
task2 76
task2 77
task2 78
task2 79
task2 80
task2 81
task2 82
task2 83
task1 79
task1 80
task1 81
task1 82
task1 83
task1 84
task1 85
task1 86
task1 87
task1 88
task1 89
task2 84
task2 85
task2 86
task2 87
task2 88
task2 89
task2 90
task2 91
task2 92
task2 93
task2 94
task2 95
task2 96
task2 97
task2 98
task2 99
task1 90
task1 91
task1 92
task1 93
task1 94
task1 95
task1 96
task1 97
task1 98
task1 99