在java中由于创建的线程与os线程一一对应,所以java中的每个线程占用一个时间片来运行。而go中多个协程对应一个os 线程,也就是多个协程对应了一个时间片,go则使用自己的调度策略(非os的调度策略)来让多个协程使用一个时间片来并发的运行。也就是go中存在两级策略,一个是go语言层面的调度多个协程公用一个时间片,一个是os层面的调度多个逻辑处理器轮询占用不同的时间片。
二、创建协程
在java中创建一个线程:
public static void main(String[] args) {
Thread thread = new Thread(() -> {
//run method dosomthing
});
thread.start();
}
注: 如上代码创建了一线程并启动,在java中存在用户线程与deamon线程之分,当不存在用户线程时候,jvm进程就退出了(而不管main函数所在线程是否已经结束).
在go中创建一个协程:
func main() {
//开启一个协程,执行匿名函数里面的内容
go func(){
//do somthing
fmt.Println("im a go 协程")
}()
//休眠10s
time.Sleep(10 \* time.Second)
}
注意: 如上通过go关键字开启一个协程,执行匿名函数里面的内容,这里需要注意main函数所在线程需要休眠以下,以便等开启的协程执行,这是因为go中只要main函数线程退出则进程就退出。
三、同步
在java中我们可以使用Semaphore、CountDownLatch、CyclicBarrier等进行多线程之间同步,比如下面例子:
public final static Semaphore SEMAPHORE = new Semaphore(0);
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(() -> {
try {
//run method dosomthing
System.out.println(Thread.currentThread().getName() + "done");
}finally {
SEMAPHORE.release();
}
},"thread-1");
thread1.start();
Thread thread2 = new Thread(() -> {
try {
[video(video-8PGqMbZO-1716354551447)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=1804892953)(image-https://img-blog.csdnimg.cn/img_convert/d03a705143646f4f3f6ea879d59b2788.png)(title-必看视频!获取2024年最新Java开发全套学习资料 备注Java)]
//run method dosomthing
System.out.println(Thread.currentThread().getName() + "done");
}finally {
SEMAPHORE.release();
}
},"thread-2");
thread2.start();
System.out.println("wait all sub thread end");
SEMAPHORE.acquire(2);
System.out.println("all sub thread end");
}
在go中也有类似的工具类:
//创建同步器
var wg sync.WaitGroup
func main() {
//两个信号
wg.Add(2)
//开启一个协程,执行匿名函数里面的内容
go func() {
//信号量减去1
defer wg.Done()
//do somthing
fmt.Println("im A go 协程")
}()
//开启一个协程,执行匿名函数里面的内容
go func() {
//信号量减去1
defer wg.Done()
//do somthing
fmt.Println("im B go 协程")
}()
fmt.Println("wait all sub thread end")
wg.Wait()
fmt.Println(" all sub thread end")
}
四、通道
go中通道分为有缓冲和无缓冲的,本节我们看如何使用有缓冲通道实现生产消费模型
var wg sync.WaitGroup
func printer(ch chan int) {
for i := range ch {
fmt.Println(i)
### 最后
小编精心为大家准备了一手资料
![](https://img-blog.csdnimg.cn/img_convert/8bd7eaa1cae9cf0abbdbcead55bf3226.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/e7ab43968700f732c5664ef7259742a3.webp?x-oss-process=image/format,png)
以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术
【附】架构书籍
1. BAT面试的20道高频数据库问题解析
2. Java面试宝典
3. Netty实战
4. 算法
![](https://img-blog.csdnimg.cn/img_convert/b2549a075c29a8e7f13be9d2c22dbac2.webp?x-oss-process=image/format,png)
**BATJ面试要点及Java架构师进阶资料**
![](https://img-blog.csdnimg.cn/img_convert/583c80cb60dc46208e942c680bd44d85.webp?x-oss-process=image/format,png)
1. BAT面试的20道高频数据库问题解析
2. Java面试宝典
3. Netty实战
4. 算法
[外链图片转存中...(img-aFi5ogNR-1716441417246)]
**BATJ面试要点及Java架构师进阶资料**
[外链图片转存中...(img-eDrxIV04-1716441417246)]