协程与线程的区别

协程和线程质的不同(??存疑

协程的特点:

  • 该任务的业务代码主动要求切换,即让出执行权
  • 发生了IO,导致执行阻塞

只有这两种情况会发生协程出让出执行权

而线程一般是时间片。

线程的java代码

public class thread {
    public static void main(String[] args){
        new Thread(new Test_thread()).start();
        new Thread(new Test_thread2()).start();
    }
}

class Test_thread implements Runnable{
    public void run(){
        for(int i = 0 ; i < 100 ; i ++){
            System.out.println("thread1:" + i);
        }
    }
}

class Test_thread2 implements Runnable{
    public void run(){
        for(int i = 100 ; i < 200 ; i ++){
            System.out.println("thread 2:" + i);
        }
    }
}

线程运行来回切换。

这个切换是一个比较大的开销

Golang的协程

package main

import (
	"fmt"
	"strconv"
	"time"
)

func main() {
	//用匿名函数的方法开协程
	//协程1
	go func() {
		for i := 1; i < 100; i ++ {
			fmt.Println("routine 1 :" + strconv.Itoa(i))
		}
	}()

	//协程2
	go func() {
		for i := 100 ; i < 200 ; i ++ {
			fmt.Println("routine 2 :" + strconv.Itoa(i))
		}
	}()

	time.Sleep(time.Second)
}

但是好像和线程运行一样也会切换,可能是Golang新版本和教程有出入,等之后看Golang源码的时候记得关注协程和线程方面。