什么是并发
为什么要学习并发:
知道了并发可以充分利用CPU资源,使我们编写的程序性能更高。
程序
程序 是数据和指令的有序集合,本身无意义,就是一个静态的概念。
进程 是执行程序的一个运行过程,操作系统的资源分配,是动态概念。
线程 是程序执行过程中的确切操作的执行对象。
线程
启动一个程序就会启动一个进程,一个进程内包含1个到多个线程 main线程是主线程,程序的入口,用于执行整个程序。一个线程内包含多个指令(线程是cpu的调度和执行单位),
cpu是接受线程,处理指令的地方,一个cpu一次只能处理一个线程任务,线程需要获取cpu时间片才能被cpu处理,时间片很短
CPU、进程与线程的关系图(基础关系)
P: 进程
UT: 线程
并发
1.并发连接数是指服务器当前时刻一共维持了多少TCP连接,而这些连接上是否有数据通讯并不关心,例如一台消息推送服务器上可能维持了百万的设备连接,由于连接上很少有数据通讯,所以这台服务器上负载可能几乎为0,只要内存足够,还可以继续接受连接。
2.并发请求数一般用QPS(服务器每秒处理多少请求)来衡量,而当前时刻服务器上有多少个tcp连接并不关心。例如一台服务器只有10个客户端连接,每个客户端连接上每秒有1W个请求,那么要求服务端需要至少能支撑10*1W=10W每秒的吞吐量(QPS)。假设10W吞吐量每秒是这台服务器的极限,如果每个客户端每秒发送1个请求给服务端,那么这台服务器能够支撑10W个客户端。
并发条件
第一,是否有共享变量
第二,是否多线程环境
第三,是否多个线程更新共享变量
并发的特点:
1.速度(更快的执行):
通常,并发都是提高运行在单处理器上的程序性能;(事实上,如果没有阻塞。那么在单处理器上的使用并发不会提升速度。)
2.设计可管理(改进代码的设计):
java线程机制都是抢占式的,即调度机制会周期性的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片,使得每个线程都会分配到数量合理的时间去驱动他的任务。
协作多线程:每个任务都会自动放弃控制,由程序员有意识的插入让步语句;
协作的优势:能够合理的分配cpu资源,达到想要的效果。
并发示意图:
箭头代表线程在执行任务
虚线表示线程交替执行停留片段
基本的线程机制:
通过使用多线程机制将程序分为多个分离的、独立运行的任务,每个任务(线程)都会“认为”自己一直占用CPU,但事实上CPU时间是划分成片段分配给了所有任务。
定义线程任务
线程可以驱动任务,因此,你需要一种描述任务的方式,这可以由Runnable接口来提供。要想定义任务,只需要实现Runnable接口并编写run()方法,使得该任务可以执行你的命令。
例如:
public class Pl implements Runnable {
public void run() {
System.out.println("早上,起床");
System.out.println("上午,下午,工作,学习");
System.out.println("晚上,睡觉");
}
}
开启线程任务
package com.tanjie.concurrent;
public class MainClass1{
public static void main(String[] args) {
Thread t = new Thread(new Pl());
t.start();
System.out.println("主线程执行自己的命令....");
}
}