关于多线程文章
关于多线程的基本理解
首先我们得理解任务,线程,cpu之前的关系?
任务就是我们执行当前想法,线程就是这个需求的执行过程,cpu就是去执行这个线程。
现在是有多个任务,多个线程,需要cpu去执行,怎么去处理?如果是程序中是单线程,那么多个线程过来得排队,这样影响执行效率,在业务需求没有多的关联关系,我们可以使用多线程。
解决办法,线程池,多个任务在线程池外等候,当实例了一个线程池,在线程池调度中心,可以接受外部等候的线程过来执行,执行之前线程池中的线程是阻塞的,在调度中心外部某个任务和线程池中线程有对应关系后,这个线程就去执行这个任务,这个时候有多个线程,多个任务,就可以实现多线程对多任务同时处理,实现多线程。
那我们是不是觉得线程池中的线程越多越好呢?
显然不是的,我们程序的执行都是在jvm中开辟一道内存空间,而我们这个内容空间是存在某在一个服务器或者pc机上,是我们本身的资源,资源越多速度肯定会慢下来,而且我们在实例化一个线程池之后,jvm开辟的内存空间就确定了,显然线程池里面的运输线程越多不一定越好。
多线程状态下cpu是怎么执行的?
在多线程状态下,cpu执行是随机的,它不单独执行哪个线程先执行,当我们在代码中由上而下.start()时,其执行也不是我们程序的执行顺序,而是cpu随机启用执行的,在使用多线程技术时,多线程的运行结果和多线程的执行顺序或者调用顺序是无关的。
**线程的基本概念、线程的基本状态及状态之间的关系**
线程,有时称为轻量级进程,是CPU使用的基本单元;它由线程ID、程序计数器、寄存器集合和堆栈组成。它与属于同一进程的其他线程共享其代码段、 数据段和其他操作系统资源(如打开文件和信号)。
线程有四种状态:新生状态、可运行状态、被阻塞状态、死亡状态。
什么是线程,线程和进程的区别是什么
线程,程序执行流的最小执行单位,是行程中的实际运作单位,经常容易和进程这个概念混淆。那么,线程和进程究竟有什么区别呢?首先,进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者。可以说,进程中包含了多个可以同时运行的线程。
多线程有几种实现方法,都是什么?
1. 继承 Thread 类 2. 实现 Runnable 接口再 new Thread(YourRunnableOjbect)
.什么是多线程?
多线程的实现原理:事实上,同一时间内单核的CPU只能执行一个线程,多线程是CPU快速的在多个线程之间进行切换(调度),造成了多个 线程同时执行的假象。
1.基本概念:
多线程指的是这个程序(一个进程)运行时产生了不止一个线程
并行:
多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
并发:
通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往 产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。
并行和并发:在我们看来,都是可以同时执行多种任务,那么,到底他们二者有什么区别呢?
并发,从宏观方面来说,并发就是同时进行多种时间,实际上,这几种时间,并不是同时进行的,而是交替进行的,而由于CPU的运算速度非常的 快,会造 成我们的一种错觉,就是在同一时间内进行了多种事情而并发,则是真正意义上的同时进行多种事情。这种只可以在多核CPU的基础下完成。
线程安全
指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,cpu是不是够用 即可。反过来,线程不安全就意味着线程的调度顺序会影响最终结果。
线程的状态
NEW(新建状态)
当一个线程创建以后,就处于新建状态。那什么时候这个状态会改变呢?只要它调用的start()方法,线程就进入了锁池状态。
线程池的作用
线程主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行,减少创建和销毁线程的次数,每个工作线程可以多次使用,可根据系统情况调整执行的线程数量,防止消耗过多内存
synchronized的使用
锁的本质是对象实例,对于非静态方法来说,Synchronized 有两种呈现形式,Synchronized方法体和Synchronized语句块。两种呈现形式本质上的锁都是对象实例。
1.锁定实例
public class SynchronizeDemo {
public void doSth1() {
/**
* 锁对象实例 synchronizeDemo
*/
synchronized (synchronizeDemo){
try {
System.out.println("正在执行方法");
Thread.sleep(10000);
System.out.println("正在退出方法");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void doSth2() {
/**
* 锁对象实例 this 等同于 synchronizeDemo
*/
synchronized (this){
try {
System.out.println("正在执行方法");
Thread.sleep(10000);
System.out.println("正在退出方法");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
synchronized块中的方法获取了lock实例的monitor,如果实例相同,那么只有一个线程能执行该块内容