您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > 【黑马程序员】java基础之线程
黑马程序员合肥中心编著【黑马程序员】java基础之线程摘要:Java基础-线程这些是黑马程序员java基础的一个很核心的内容。今天主要给大家简单讲解一下Java基础-线程,以后会慢慢讲解黑马程序员的课程内容!一.概述1.1简介线程是java的编程中的重中之重,弄清概念是一个程序员的基本功。下面介绍下线程相关的基本概念和实现。1.2进程计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位(指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程)1.3线程有时被称为轻量级进程(LightweightProcess,LWP),是程序执行流的最小单元(cpu运行)。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。tips:这里形容下,一个应用程序相当于一个仓库,而一个线程相当于一个取货单。有一个管理员(cpu),每一只能取一个商品(计算结果)。管理员不会一次把一个单子的商品取完,而是随机按着一个单子的顺序取一个商品,然后随机按另外一个单子取货。黑马程序员合肥中心编著1.4.线程状态java中的实现:a)新生态:newThread()对象,这个对象封装了JVM启动一个新线程的方式,当start()后将控制权交给程序计数器,生成新的线程。b)就绪状态“在程序计数器列表中、等待CPU的使用权start(),notify(),nitifyall(),I/O完成d)运行状态:占用cpu时间,进行逻辑运算。run(),等待调度器调用e)阻塞状态:处于不正常的运行和等待中。jion(),wait(),sleep(),suspend(),I/O请求f)死亡状态:运行完成、强行停止。stop()、destory()1.5线程总结1.只有run()状态可以直接获取数据的使用权2.线程的研究主要是在运行状态和阻塞状态。3.线程虽然有优先级,但是JVM并不是100%安装优先级来调用。随机错乱的调用方式4.阻塞的方式:一种是sleep(),整个线程让调度器停止调度。一种是线程在对象锁的等待序列上。5.抽象一个图,便于记忆:线程会在红色部分停止调度,只有在在可执行序列才会被调度。黑马程序员合肥中心编著二.案例2.1线程名每一个线程都会有一个线程名。a)主线程名:程序的启动线程接---线程名:mainb)默认线程名:thread-N(N是数字)c)自定义线程名[AppleScript]纯文本查看复制代码?01020304050607080910111213141/***@author传智播客*//***@see线程名**@authorssHss**/publicclassThreadNameimplementsRunnable{publicstaticvoidmain(String[]args){System.out.println(Thread.currentThread().getName());//mainThreadNametn=newThreadName();Threadtr=newThread(tn);//线程名:thread-0Threadtr2=newThread(tn,tr2);//线程名:tr2tr.start();tr2.start();}@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName());}}黑马程序员合肥中心编著5161718192021222324252.2阻止当前线程:下面几种都不会释放对象锁a)Thread.yield():让步,建议具有相同优先级的其它线程可以运行了。[AppleScript]纯文本查看复制代码?0102030405060708/***@将当前线程从运行态放入到可运行态、将CPU交给线程优先级高的线程*@author传智播客**/publicclassThreadYieldimplementsRunnable{publicstaticvoidmain(String[]args){System.out.println(Thread.currentThread().getName()+start);ThreadYieldty=newThreadYield();//线程1Threadt1=newThread(ty,t--1);t1.setPriority(8);//默认的优先级为5//线程2Threadt2=newThread(ty,t--2);黑马程序员合肥中心编著09101112131415161718192021222324252627282930//t1.setPriority(8);t1.start();t2.start();System.out.println(Thread.currentThread().getName()+end);}@Overridepublicvoidrun(){for(inti=0;i10;i++){System.out.println(Thread.currentThread().getName()+:获取了:+i);if(i%3==0){Thread.yield();}}}}黑马程序员合肥中心编著313233b)Thread.sleep(x毫秒):让当前线程阻塞x毫秒。c)join():一个线程在其他线程上调用join()方法,其效果将其它线程排在本线程后面。[AppleScript]纯文本查看复制代码?0102030405060708091011121314151617181920212223242526272829/***@author传智播客*//***@t.JOIN:将当前线程加入到t线程的后面***/publicclassThreadJoin{publicstaticvoidmain(String[]args)throwsInterruptedException{Sleepersleepy=newSleeper(Sleeper,1500);Sleepergrumpy=newSleeper(Grumpy,1500);Joinerdopey=newJoiner(Dopey,sleepy);Joinerdoc=newJoiner(Doc,grumpy);grumpy.interrupt();}}classSleeperextendsThread{privateintduration;publicSleeper(Stringname,intsleepTime){super(name);duration=sleepTime;this.start();}黑马程序员合肥中心编著30313233343536373839404142434445464748495051525354555657publicvoidrun(){try{Thread.sleep(duration);}catch(Exceptione){System.out.println(this.getName()+wasinterrupted+this.isInterrupted());}System.out.println(this.getName()+hasawakened);}}classJoinerextendsThread{privateSleepersleeper;publicJoiner(Stringname,Sleepersleeper){super(name);this.sleeper=sleeper;this.start();}publicvoidrun(){try{sleeper.join();}catch(Exceptione){System.out.println(Ineterrupted);}System.out.println(this.getName()+joincompleted);}}2.3Executors:执行器[AppleScript]纯文本查看复制代码?01020304/***@author传智播客*/publicclassExecutor{/***@seeExecutor:线程池,管理线程的创建和销毁*@paramargs黑马程序员合肥中心编著05060708091011121314151617181920212223242526*/publicstaticvoidmain(String[]args){//ExecutorServicees=Executors.newCachedThreadPool();//创建与所需线程相同数量的线程,回收旧线程时停止新建线程//ExecutorServicees=Executors.newFixedThreadPool(5);//创建固定数量的线程。ExecutorServicees=Executors.newSingleThreadExecutor();//创建单个线程,然后排队执行for(inti=0;i5;i++){es.execute(newTestClass());}es.shutdown();}}classTestClassimplementsRunnable{@Overridepublicvoidrun(){for(inti=0;i10;i++){System.out.println(Thread.currentThread().getName()+i--+i);}}}黑马程序员合肥中心编著272829302.4synchronized:对象锁a)每个对象都有一个对象锁,保证线程在操作数据时的,数据一致性。c)获取了这个锁,就获取了这个的资源控制权。其它线程只有去对象的对象锁列表(阻塞状态),等待锁释放。在释放锁的时候,会把所有对象锁列表中的线程都移动到可运行列表中。b)释放锁的方式:(理解记忆)1.自动释放锁(运行完):将对象锁列表中的线程都移动到可运行状态列表,包括自己,然后释放锁。所有线程都是可执行状态,然后抢占锁的使用权。2.wait释放锁:把自己加入到对象锁列表,并释放锁。但是不清理对象锁列表。Tips:1.当获取对象锁的时候(synchronzied),会同将锁里面调用的对象一起锁定(当前对象的嵌套、其它对象的调用)。c)由于对象锁synchronized使用:非静态方法:synchronized(this)锁的是堆中的地址空间。静态方法:synchronized(xxxx.class)锁的是class文件存放在永久区的地址空间。一般静态变量最好是放在静态方法中执行,保证安全行。[AppleScript]纯文本查看复制代码?黑马程序员合肥中心编著01020304050607080910111213141516171819202122/***@生存者、消费者模式*@author传智播客**/publicclassThreadSynChronimplementsRunnable{Testtc=null;publicstaticvoidmain(String[]args){System.out.println(Thread.currentThread().getName()+START);Testtest=newTest();ThreadSynChrontsc=newThreadSynChron(test);Threadt1=newThread(tsc);Threadt2=newThread(tsc);t1.start();t2.start();}publicThreadSynChron(Testtest){this.tc=test;}publicvoidA(){synchronized(this){System.o
本文标题:【黑马程序员】java基础之线程
链接地址:https://www.777doc.com/doc-7634862 .html