线程与进程
程序设计的目标
性能:高性能的程序应该可以等同于CPU的利用率,CPU的利用率越高(一直在工作,没有闲下来的时候),程序的性能越高。
体验:这里的体验不只是界面多么漂亮,功能多么顺手,这里的体验指程序的响应速度,响应速度越快,用户体验越好。
Socket网络编程
在同一个JVM运行环境中,类与类之间可以直接相互调用,但是处于不同的JVM中的类,它们之间是无法直接调用的,这时通过Socket网络编程可以让处于不同JVM、甚至不同计算机的类之间进行通讯。
Socket:相当于电话座机
IP:相当于电话号码
Socket的API常用方法:
accept()--阻塞;
getInputStream()--获取网络连接输入流
getOutputStream()-- 获取网络连接输出流
单线程多任务IO阻塞(例如:磁盘操作)时CPU空闲---解决方案:[单线程多任务异步IO --让准备好的任务优先执行]
单线程多任务,有耗时计算 即CPU计算耗时阻塞----解决方案:[多线程程序(可进行任务执行切换)]
多CPU执行效果更好,但决定如何分配难,也就是多核下的线程同步与互斥
进程:在操作系统中运行着的一个独立的程序(桌子)
线程:一个进程中一条独立的执行分支。(一个人)
多线程与多进程:
一群人(多个线程)在一个桌子(进程)上吃饭,他们会涉及到一些问题,比如多个人可能会夹一个菜(竞争),A和B同时看到盘子里面有一块肉,同时伸出筷子去夹,A先夹走,B迟了一点伸到盘子的时候已经没了,只能缩回来(临界资源,互斥),有一个点心需要用馍夹肉一起吃。A夹了肉,B夹了馍,A需要B的馍,B需要A的肉,他们僵持不下谁都不让步(死锁)。
多线程之间的资源共享是非常方便的,因为他们共用进程的资源空间(在一个桌子上),但是需要注意一系列的问题,竞争,死锁,同步等。如果在旁边再开一个桌子(进程)。 那么桌子之间讲话,递东西又不方便(进程间通信),而开一个桌子的开销比在一个桌子上多加一个人的开销要大。另外一个桌子上的人数不可能无限制增加,桌子的容量有限也坐不下这么多人(进程的线程句柄是有限制的)。一个桌子坏了不会影响到另一个桌子上面人的就餐情况(进程间相互DuLi,一个进程崩溃不会影响另一个),而一个桌子上的某人喝挂了需要送医院,估计这一桌人都要散了(线程挂掉会导致整个进程也挂掉)。所以多线程与多进程是各有优缺点,不能一概而论。
总结
单线程程序:适合IO异步,不能阻塞,不能有大量耗CPU的计算。典型如Nodejs,还有一些网络程序
多线程程序:适合CPU密集型程序
*多线程执行没有一个确定的顺序,并不是先启动的线程一定先执行,当前一刻谁抢占了CPU资源,谁就先执行。
*主线程只是负责启动一条线程,并不需要等待该县城运行结束,如果主线程调用的是run方法而不是start方法,那么就仅仅使普通调用,这样仅仅是单线程程序
*同一条线程不能启动多次。
如何通过Runnable接口实现多线程
1、由于Runnable中没有start(),所以启动线程依然要调用Thread类中的start();