我曾经以为多线程的作用是这样的——你运算1+1=2需要1秒,如果用了两个线程,那么1+1=2只要算0.5s。但是实际上并不是如此。
我认为,多线程解决的是程序等待的问题。
想象这样一个使用环境。如果你写了一个串口通信程序,只有mian函数,但是同时要做收和发两件事,你应该如何处理?按照单片机的思路,放中断啊。但是如果没有中断呢?那就是查询。什么是查询呢?就是:
while(1){
send()
rev();
}
这么写的话对实时性会有很大影响。为了解决这个问题,那我就想了,如果有两个主函数多好啊?两个主函数,然后一个运行send(),一个运行rev()。基于此,下一个解决方案就出来了:
Send.class,Rev.class。
写两个类,两个mian函数就不行了么?
但是问题又来了,如果我想实现一个功能“发送刚刚接收到的信息”,那我必须让Send.class和Rev.class通信,但是它们却分属两个不同的程序。
那有没有一种方式,可以在一个程序里,有多个main()呢?有,就是多线程。
P.S.“同时”不一定是真“同时”,CPU通过分时间片来完成多线程,切换速度太快,从而营造出两个线程同时运行的假象,但是本质上还是单一线程在运行的。所以我说,多线程解决的是程序中等待的问题,从顺序执行,变成了并行。但是因为实质上在CPU层面还是单一线程运行,只不过用了“切换”这个小把戏,因此不能像本文刚开头说的那样,0.5s解决1+1=2的问题。
总结一下:线程相当于在一个程序中有多个main()函数。
下面说一说进程和线程的区别:
总结:进程由操作系统控制,用来分配资源(内存),具有独立的代码和数据空间。线程可以由程序员创建,同一程序的线程间共享内存,代码,程序等资源,这就是我说的,如果想实现“发送刚刚接受到的消息”,如果用多线程就很容易完成。因为他们使用的是同一个内存。可能有的小伙伴对内存还不太理解,那我这么说吧,你的数组,变量,都在内存里,多线程共享内存的意思就是,A线程可以用B线程的变量。当然,由此就引出了多线程一个很观念的概念,锁。这很重要,之后单独说吧。