




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。一个进程中至少有一个线程。Java VM 启动的时候会有一个进程java.exe.该进程中至少一个线程负责java程序的执行。而且这个线程运行的代码存在于main方法中。该线程称之为主线程。扩展:其实更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程。1如何在自定义的代码中,自定义一个线程呢?过对api的查找,java已经提供了对线程这类事物的描述。就Thread类。进程线程都是由系统创建的!创建线程的第一种方式:继承Thread类。步骤:1,定义类继承Thread。2,复写Thread类中的run方法。目的:将自定义代码存储在run方法。让线程运行。3,调用线程的start方法,该方法两个作用:启动线程,调用run方法。原理部分:发现运行结果每一次都不同。因为多个线程都获取cpu的执行权。cpu执行到谁,谁就运行。明确一点,在某一个时刻,只能有一个程序在运行。(多核除外)cpu在做着快速的切换,以达到看上去是同时运行的效果。我们可以形象把多线程的运行行为在互相抢夺cpu的执行权。这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长,cpu说的算。为什么要覆盖run方法呢?Thread类用于描述线程。该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。也就是说Thread类中的run方法,用于存储线程要运行的代码。class Demo extends Threadpublic void run()for(int x=0; x60; x+)System.out.println(demo run-+x);class ThreadDemo public static void main(String args) /也是一个控制单元!/for(int x=0; x4000; x+)/System.out.println(Hello World!);Demo d = new Demo();/创建好一个线程。相当于一个控制单元!/d.start();/开启线程并执行该线程的run方法。调用了底层!d.run();/仅仅是对象调用方法。而线程创建了,并没有运行。还是/在主线程里面运行的!属于单线程程序!仅仅封装线程运行的代码!for(int x=0; x60; x+)System.out.println(Hello World!-+x);练习:创建两个线程,和主线程交替运行。原来线程都有自己默认的名称。Thread-编号 该编号从0开始。static Thread currentThread()获取当前线程对象。getName(): 获取线程名称。置线程名称:setName或者构造函数*/class Test extends Thread/private String name;Test(String name)/ = name;super(name);public void run()for(int x=0; x60; x+)System.out.println(Thread.currentThread()=this)+.+this.getName()+ run.+x);class ThreadTest public static void main(String args) Test t1 = new Test(one-);Test t2 = new Test(two+);t1.start();t2.start();/t1.run();/t2.run();for(int x=0; x0)System.out.println(Thread.currentThread().getName()+.sale : + tick-);class TicketDemopublic static void main(String args) Ticket t = new Ticket();Thread t1 = new Thread(t);/创建了一个线程;Thread t2 = new Thread(t);/创建了一个线程;Thread t3 = new Thread(t);/创建了一个线程;Thread t4 = new Thread(t);/创建了一个线程;t1.start();t2.start();t3.start();t4.start();/*Ticket t1 = new Ticket();/Ticket t2 = new Ticket();/Ticket t3 = new Ticket();/Ticket t4 = new Ticket();t1.start();t1.start();t1.start();t1.start();*/*(重点掌握部分)通过分析,发现,打印出0,-1,-2等错票。多线程的运行出现了安全问题。问题的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。解决办法:对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行.java对于多线程的安全问题提供了专业的解决方式。是同步代码块。synchronized(对象)需要被同步的代码对象如同锁。持有锁的线程可以在同步中执行。没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。火车上的卫生间-经典。同步的前提:1,必须要有两个或者两个以上的线程。2,必须是多个线程使用同一个锁。(注意:同步函数所用的锁是this。而同步块用的是自定义的锁“对象”。)必须保证同步中只能有一个线程在运行。好处:解决了多线程的安全问题。弊端:多个线程需要判断锁,较为消耗资源,*/class Ticket implements Runnableprivate int tick = 1000;Object obj = new Object();public void run()while(true)synchronized(obj)(如果这个同步没有的话就会出现卖出负数号票的情况。)if(tick0) /线程在哪儿被“中断”,当此线程再次有执行权时就会接着中断的地方继续执行下去。因此这儿可能会出现卖出-1,0号票的可能!/tryThread.sleep(10);catch(Exception e)System.out.println(Thread.currentThread().getName()+.sale : + tick-);class TicketDemo2public static void main(String args) Ticket t = new Ticket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);Thread t3 = new Thread(t);Thread t4 = new Thread(t);t1.start();t2.start();t3.start();t4.start();/*同步函数用的是哪一个锁呢?函数需要被对象调用。那么函数都有一个所属对象引用。就是this。所以同步函数使用的锁是this。通过该程序进行验证。使用两个线程来买票。一个线程在同步代码块中。一个线程在同步函数中。都在执行买票动作。*/class Ticket implements Runnableprivate int tick = 100;Object obj = new Object();boolean flag = true;public void run()if(flag)while(true)synchronized(this)if(tick0)tryThread.sleep(10);catch(Exception e)System.out.println(Thread.currentThread().getName()+.code : + tick-);elsewhile(true)show();public synchronized void show()/thisif(tick0)tryThread.sleep(10);catch(Exception e)System.out.println(Thread.currentThread().getName()+.show. : + tick-);class ThisLockDemopublic static void main(String args) Ticket t = new Ticket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);t1.start();tryThread.sleep(10);catch(Exception e)t.flag = false;t2.start();/Thread t3 = new Thread(t);/Thread t4 = new Thread(t);/t3.start();/t4.start();/*如果同步函数被静态修饰后,使用的锁是什么呢?通过验证,发现不在是this。因为静态方法中也不可以定义this。静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象。类名.class 该对象的类型是Class静态的同步方法,使用的锁是该方法所在类的字节码文件对象。 类名.class*/class Ticket implements Runnableprivate static int tick = 100;/Object obj = new Object();boolean flag = true;public void run()if(flag)while(true)synchronized(Ticket.class)if(tick0)tryThread.sleep(10);catch(Exception e)System.out.println(Thread.currentThread().getName()+.code : + tick-);elsewhile(true)show();public static synchronized void show()if(tick0)tryThread.sleep(10);catch(Exception e)System.out.println(Thread.currentThread().getName()+.show. : + tick-);class StaticMethodDemopublic static void main(String args) Ticket t = new Ticket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);t1.start();tryThread.sleep(10);catch(Exception e)t.flag = false;t2.start();/*单例设计模式。*/饿汉式。/*class Singleprivate static final Single s = new Single();private Single()public static Single getInstance()return s;*/懒汉式class Singleprivate static Single s = null;private Single()public static Single getInstance()if(s=null)synchronized(Single.class)if(s=null) /双重判断标准,面试时考的都是这种单利设计模式,但是在实际的设计中只需要用饿汉式就可以了。/-A;s = new Single();return s;class SingleDemo public static void main(String args) System.out.println(Hello World!);死锁:某一个线程t1持有锁a,另一个线程t2持有锁b,t1里面有一个方法要用到B锁,t2里面有一个方法要用到锁a,从而形成一个等待循环“你等我,我等你”造成死锁!class Test implements Runnableprivate boolean flag;Test(boolean flag)this.flag = flag;public void run()if(flag)while(true)synchronized(MyLock.locka)System.out.println(Thread.currentThread().getName()+.if locka );synchronized(MyLock.lockb)System.out.println(Thread.currentThread().getName()+.if lockb);elsewhile(true)synchronized(MyLock.lockb)System.out.println(Thread.currentThread().getName()+.else lockb);synchronized(MyLock.locka)System.out.println(Thread.currentThread().getName()+.else locka);class MyLockstatic Object locka = new Object();static Object lockb = new Object();class DeadLockTestpublic static void main(String args) Thread t1 = new Thread(new Test(true);Thread t2 = new Thread(new Test(false);t1.start();t2.start();/*死锁。同步中嵌套同步。*/class Ticket implements Runnableprivate int tick = 1000;Object obj = new Object();boolean flag = true;public void run()if(flag)while(true)synchronized(obj)show();elsewhile(true)show();public synchronized void show()/thissynchronized(obj)if(tick0)tryThread.sleep(10);catch(Exception e)System.out.println(Thread.currentThread().getName()+.code : + tick-);class DeadLockDemopublic static void main(String args) Ticket t = new Ticket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);t1.start();tryThread.sleep(10);catch(Exception e)t.flag = false;t2.start();class MyThread extends Threadpublic void run()try Thread.currentThread().sleep(3000); catch (InterruptedException e) System.out.println(MyThread running);public class ThreadTestpublic static void main(String argv) MyThread t = new MyThread();t.run();t.start();System.out.println(Thread Test); /*代码分析过程:MyThread t = new MyThread();创建了一个线程。t.run();调用MyThread对象的run方法。这是只有一个线程在运行就是主线程。当主线程执行到了run方法中的sleep(3000);时。这是主线程处于冻结状态。程序并没有任何执行。当3秒过后,主线程打印了 MyThread running。 run方法执行结束。t.start();开启了t线程。有两种可能情况。第一种,主线程在只执行了t.start()后,还具有执行权,继续往下执行,打印了Thread Test。主线程结束。t线程获取执行权,调用自己的run方法。然后执行的sleep(3000);冻结3秒。3秒后,打印MyThread running t线程结束,整个程序结束。第二种情况:主线程执行到t.start();开启了t线程,t线程就直接获取到了执行权。就调用自己的run方法。指定到sleep(3000).t线程冻结3秒,这是t线程就是释放了执行权。那么主线程开始执行打印了Thread Test,主线程结束。等到3秒后,t线程打印MyThread running ,然后t线程结束。程序结束。*/*stop方法已经过时。如何停止线程?只有一种,run方法结束。开启多线程运行,运行代码通常是循环结构。只要控制住循环,就可以让run方法结束,也就是线程结束。特殊情况:当线程处于了冻结状态。就不会读取到标记。那么线程就不会结束。当没有指定的方式让冻结的线程恢复到运行状态是,这时需要对冻结进行清除。强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。Thread类提供该方法 interrupt();*/class StopThread implements Runnableprivate boolean flag =true;public void run()while(flag)System.out.println(Thread.currentThread().getName()+.run);public void changeFlag()flag = false;class StopThreadDemopublic static void main(String args) StopThread st = new StopThread();Thread t1 = new Thread(st);Thread t2 = new Thread(st);t1.setDaemon(true);t2.setDaemon(true);t1.start();t2.start();int num = 0;while(true)if(num+ = 60)/st.changeFlag();/errupt();/errupt();break;System.out.println(Thread.currentThread().getName()+.+num);System.out.println(over);/*线程间通讯:其实就是多个线程在操作同一个资源,但是操作的动作不同。*/class Res/将共享资源封装进对象中String name;String sex;boolean flag = false;/控制输入一次,然后再打印一次。防止cpu在切换时一直输入(此时会覆盖前一次输入的值!),或者一直重复的输出!class Input implements Runnableprivate Res r ;Input(Res r)this.r = r;public void run()int x = 0;while(true)synchronized(r)if(r.flag) tryr.wait();catch(Exception e) /等待唤醒机制,在开发中用到的较多!线程运行时,内存中会建立一个线程池,等待的线程被放进线程池里面。一进入等待状态这下面的程序就暂时不能执行了。等待被唤醒后再接着执行下去。if(x=0)=mike;/对共享资源进行操作r.sex=man;=丽丽;r.sex = 女女女女女;x = (x+1)%2;r.flag = true;r.notify();class Output implements Runnableprivate Res r ;Output(Res r)this.r = r;public void run()while(true)synchronized(r)if( !r.flag)tryr.wait();catch(Exception e)System.out.println(+.+r.sex);r.flag = false;r.notify();class InputOutputDemopublic static void main(String args) Res r = new Res();Input in = new Input(r);Output out = new Output(r);Thread t1 = new Thread(in);Thread t2 = new Thread(out);t1.start();t2.start();/notifyAll();/*wait: notify(); notifyAll();都使用在同步中,因为要对持有监视器(锁)的线程操作。因为只有同步才具有锁,所以要使用在同步中。为什么这些操作线程的方法要定义Object类中呢?因为这些方法在操作同步中的线程时,都必须要标识它们所操作线程持有的锁,只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒。不可以对不同锁中的线程进行唤醒。也就是说,等待和唤醒必须是同一个锁。而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中*/生产者和消费者例子class ProducerConsumerDemo public static void main(String args) Resource r = new Resource();Producer pro = new Producer(r);Consumer con = new Consumer(r);Thread t1 = new Thread(pro);Thread t2 = new Thread(pro);Thread
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度美容院员工保密协议及商业秘密保护合同
- 2025年度酒店客房空调滤网清洗与更换服务合同
- 2025年度高新技术产业不动产地皮转让合同
- 2025版车棚智能化停车管理系统开发与实施合同范本下载
- 2025房地产销售联合代理合同-智慧社区项目合作协议
- 2025四川宜宾市南溪区卫生健康局招募医疗卫生辅助岗位13人备考练习题库及答案解析
- 2025云南昆明市水务局机关事业单位编外人员招聘1人备考练习试题及答案解析
- 2025吉林长春市宽城区招聘合同制专职消防员22人备考练习题库及答案解析
- 2025年羊群代牧与草原病虫害防治一体化服务合同
- 2025年度智慧社区宣传栏定制及社区文化盛宴推广服务合同
- 项目资金融资合同范本
- YDT 4484-2023物联网云平台技术要求
- 2024年红河产业投资集团有限公司招聘笔试冲刺题(带答案解析)
- 《HALCON编程及工程应用》课件第9章 HALCON测量
- 医院培训课件:《护理人文关怀的践行-仁心仁护彰显大爱》
- PETS5词汇表总结大全
- 应届生培养方案
- 保险代位求偿权答辩状
- 《英语句子成分及基本结构》课件
- 汽修基础理论知识
- 综合实践活动六年级上册全册讲课课件
评论
0/150
提交评论