【JVM并发编程专题】——多线程基础

基础——线程内核

进程基本定义: 进程是资源分配的最小单位,比如说向操作系统征用4G的内存区域,所以不同进程虚拟内存空间的地址是独立,如果进程要通信就必须通过特殊的方式通信,比如:FIFO、管道消息、共享内存、队列、信号量,当然这个不作为本章的重点内容;
线程基本定义: 线程是CPU调度的最小单位,比如说你的一个JVM虚拟机中不同的需要对不同ip的用户请求来建立线程来处理,供cpu调度,而这些过程中产生的数据都存在进程为你征用的内存区域;线程的本质就是一段要执行的代码而已,多线程就是多个可能会交错执行的代码片段,以ruanbble为单位;
协程基本定义:交错执行比较随机,但是有时候我们要控制线程运行的逻辑关系,这种编程方式就叫协作,比如wait notifly 还有countLatch seqmue信号量的api都可以实现协程;以及异步编程也是协程

内核线程多路复用机制:
在jvm虚拟机实现层面,定义了两种线程的分类;一个是用户不可见的内核线程,一个是可见的用户线程,jvm利用多路复用机制,将两者线程配合在一起提高整体的jvm虚拟机性能,因为创建一个内核线程的代价比较高昂对比用户线程来讲,因此不可能每处理一个IO就建立一个内核线程,所以提前创建好多路复用是最好的;
用户线程:主要用于执行用户自定义的代码
内核线程:主要用于执行用户线程发起的系统调用请求,比如:IO请求
性能损耗:当用户发起内核请求后,jvm就将当前的线程阻塞让出cpu;进行一次上下文切换,将原线程的的cpu环境剔除,并替换为内核要执行的内容,当事件处理完后,再上下文切换回来;所以频繁的切换线程状态也是会产生损耗的,大概10微妙左右,当然具体的上下文切换细节我们将再操作系统篇章详细了解;

基础——线程创建

【继承】
	class GcTherad extends Thread{
    		public void run() {
    		}
	}
	Thread t=new GcTherad ();
	t.start();
【接口】
	class GcRunnable implements Runnable{
    		public void run() {
    		}	
	}
	Thread t=new Thread(new GcRunnable());
	t.start();
【内部类】
	Thread t1=new Thread(){
    		public void run(){
        			for(int i=1;i<=1000;i++){
            			System.out.println("你是谁啊");
        		}
    	}
	t1.start();

基础——线程数据共享

同模板--成员变量
	public class Producer extends Thread {
    		public AbstractStorage abstractStorage;
    		public Producer(AbstractStorage abstractStorage) {
        			this.abstractStorage = abstractStorage;
   		 }
    		public void run() {
        			produce(num);
    		}
	}
跨模板--中间变量:
	AbstractStorage abstractStorage = new Storage();
	Producer p1 = new Producer(abstractStorage);
	Producer p2 = new Producer(abstractStorage);
	Producer p3 = new Producer(abstractStorage);
	Consumer c1 = new Consumer(abstractStorage);
	Consumer c2 = new Consumer(abstractStorage);
	Consumer c3 = new Consumer(abstractStorage);
Ps:同一个runable直接在可以通过成员变量访问共享数据,但是不同的runable,只能在外部声明一个数据,然后传参赋值到内部runable的成员变量

基础——线程控制

【线程的五大状态】
创建:分配线程一些基本的东西;
就绪:等待调度器分配运行时间;(线程已获得除CPU之外的所有必须资源,只等待操作系统利用CPU调度算法将CPU分配给该线程以便执行)
运行:获得了运行资格;
阻塞:引起上下文切换,上下文中剔除该线程的所需要的cpu环境,一般发生于等待某一特定事件的出现(如I/O操作),完成后自动中断阻塞然后调回上下文,再次进入就绪状态
停止:最终结束;
【停止类API】
休眠:Thread.sleep(5000);//静态方法,让当前线程休眠,需要捕获中断异常
唤醒:main.setDaemon(true);//唤醒某个线程,此线程处于阻塞状态
中断:main.interrupt();//在另一个方法中调用中断线程
让出:Thread.yield();线程的调度是系统随机是不固定的,如果想在执行期间主动让出时间则调用
【信息类API】
名字:	 thread.getName()
标识:	 thread.getId()
是否存活:thread.isAlive()
是否死亡:thread.isDaemon()
是否中断:thread.isInterrupted()
设置优先级:thread.setPriority(Thread.MAX_PRIORITY)
	   thread.setPriority(Thread.MIN_PRIORITY);
	   thread.setPriority(5);

JVM并发编程专题章节:
多线程安全——synchronized
多线程安全——cas
多线程安全——aqs
多线程协作
多线程管理
多线程框架
多线程测试

GodSchool
致力于简洁的知识工程,输出高质量的知识产出,我们一起努力
博主私人微信:supperlzf

你可能感兴趣的:(JVM并发编程专题,并发编程,多线程)