多线程——面试中常考且要点非常多的内容(1)
在学习了进程之后我们发现进程不断创建与销毁的开销很大一开始想用多进程的方式即每一个客户端请求发到服务器上服务器提供一个进程给这个客户端提供服务通过多进程的方式可以实现“并发编程”的效果可效果依旧不佳为了解决上述问题引入了线程Thread也就是轻量级的进程创建与销毁的开销更小了。线程与进程的区别1.进程包含线程每个进程中都会包含一个或多个线程。每个线程都相当于一个要执行的任务而每个线程则是每个任务中运行的一段代码指令。这个可以在任务管理器上看到。2.进程是操作系统资源分配的基本单位线程是CPU上调度执行的基本单位进程与进程之间所涉及到的资源是各自独立的彼此之间互不干扰进程内部的多个线程之间会共享内存资源和硬盘资源此外进程创建需要申请资源进程销毁需要释放资源但对于线程来说只是第一个线程创建的时候和进程一起创建的时候申请资源后续再创建线程就不需要申请资源了只有所有的线程都销毁进程销毁才会真正的释放资源运行过程中销毁某个线程也不会释放资源。下面一些图片可以形象的描述进程与线程多个进程多个线程线程数量要适当线程冲突线程异常的危害以上都是进程与线程的区别需要重点理解。创建线程的五种方法线程操作系统提供的概念操作系统提供了一些api来供程序员使用。由于操作系统提供的原生线程api是C语言的并且不同操作系统的线程api都不一样Java对上述内容统一封装为Thread类。1.Thread在这之前我们可以看到在没有import包的情况下使用Thread类竟然没有报错只是因为Thread是Java.lang中默认的import包。这里的Thread是父类而Thread父类中本身有一个run方法于是子类要重写父类的run方法。但是在调用时不要调用run方法而是调用start方法run方法没有创建线程只是对之前重写的run方法进行直接调用相当于只有一个main线程。而start的作用是创建了一个新的线程这个代码可以“一心两用”同时做两件事。sleep是一个静态方法表示休眠让当前的线程暂时放弃CPU休息一会时间过了之后再执行。但在sleep方法创建后会有报错InterruptedException受查时异常于是需要捕获异常与抛出异常。顺便提一下实际开发中异常的处理方式1.记录异常信息作为日志后续程序员根据日志调查问题2.进行重试网络异常3.特别严重的问题可以通过手机邮件或微信等通知程序员报警机制要他们马上来处理。2.Runnable这个是实现Runnable重写run整体逻辑与Thread一致但它本身有解耦合的作用可以更好的修改不至于像Thread一样要改就得改所有与之有联系的部分因此推荐使用Runnable来创建线程。由于内容极多 今天的内容就到这里下次我们再讲谢谢。我的gitee链接https://gitee.com/QQ2240635095/java3_31.git