欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年马士兵_JAVA视频教程_JSE_._第章_线程 .pdf

    • 资源ID:31711505       资源大小:649.82KB        全文页数:18页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年马士兵_JAVA视频教程_JSE_._第章_线程 .pdf

    第九章线程9.1 线程的基本概念1、线程是一个程序内部的顺序控制流(线程是一个程序中不同的执行路径) 。2、线程和进程的区别a)每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销。b)线程可以看成轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。c)多进程:在操作系统中能同时运行多个任务(程序)。d)多线程:在同一应用程序中能有多个顺序同时执行。3、Java的线程是通过 jva.lang.Thread类来实现的。4、VM 启动时会有一个由主方法(public static void main() 所定义的线程。5、可以通过创建 Thread的实例来创建线程。6、每个线程都是通过某个特定的Thread 对象所对应的方法run()来完成其操作的,方法 run()称为线程体。7、通过调用 Thread类的 start()方法来启动一个线程。8、线程类的写法class Runner1 implements Runnable /建议实用 Runnable接口/class Runner1 extends Thread / 不建议使用继承!public void run() for(int i = 0; i100; i+) System.out.println(Runner1 : + i); 9、线程的调用可以用run方法启动,但这样就是方法的调用,而不是多线程!真正的是调用 Thread的 start()方法!public class TestThread1 public static void main (String args) Runner1 r = new Runner1(); /r.run();/这样就是方法的调用的,并不是真正的多线程Thread t = new Thread(r); t.start(); for(int i = 0; i100; i+) System.out.println(Main Thread :- + i); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 18 页 - - - - - - - - - 10、线程的创建和启动第一种:1)定义现场类实现Runnable 接口2)Thread myThread = new Thread(target);/target为 Runnable 接口类型3)Runnable 中只有一个方法:public void run(); 用以定义线程的运行体4)使用 Runnable 接口可以为多个线程提供数据的共享5)在实现 Runnable 接口的类的run 方法定义中可以使用Thread 的静态方法public static Thread currentThread() 读取当前线程的引用第二种:1)可以顶一个Thread 的之类并重写其run 方法如:Class MyThread extends Thread public void run(). 2)然后生成该类的对象MyThread myThread = new MyThread(.) 本课代码TestThread1.java public class TestThread1 public static void main (String args) Runner1 r = new Runner1(); /r.run(); Thread t = new Thread(r); t.start(); for(int i = 0; i100; i+) /Thread.sleep(1); System.out.println(Main Thread :- + i); /class Runner1 implements Runnable class Runner1 extends Thread public void run() /重写的方法不能抛出比被重写方法不同的异常for(int i = 0; i100; i+) /Thread.sleep(1); System.out.println(Runner1 : + i); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 18 页 - - - - - - - - - 9.2 Sleep方法1、线程的状态2、线程控制基本方法4、sleep/join/yield 方法名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 18 页 - - - - - - - - - sleep: 1)可以调用Thread 的静态方法public static void sleep(long millis) throws InterruptedException 使得当前线程休眠(暂时停止执行millis 毫秒)2)由于是静态方法,sleep可以由类名直接调用Thread.sleep(.); TestInterrupt.java join 方法1)合并某个线程yield 方法让出 CPU,给其他线程执行的机会本课代码TestInterrupt.java import java.util.*; public class TestInterrupt public static void main(String args) MyThread thread = new MyThread(); thread.start(); try Thread.sleep(10000); catch (InterruptedException e) thread.interrupt(); class MyThread extends Thread public void run() while(true) System.out.println(= +new Date() + =);/Date类在 java.tuil 包中try sleep(1000); catch(InterruptedException e) System.out.println(MyThread is rupted!); return ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 18 页 - - - - - - - - - 9.3 Join Yield Priority 1、Join TestJoin.java public class TestJoin public static void main (String args) MyThread2 t1 = new MyThread2(syxThread); t1.start(); try t1.join(); catch(InterruptedException e) for(int i=1; i=10; i+) System.out.println(MainThread is Running!); class MyThread2 extends Thread MyThread2(String s) super(s); public void run() for(int i=1; i=10; i+) System.out.println(MyThread run! + getName() ); try sleep(1000); catch(InterruptedException e) return ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 18 页 - - - - - - - - - 2、Yiled TestYiled.java public class TestYield public static void main(String args) MyThread3 t1 = new MyThread3(t1); MyThread3 t2 = new MyThread3(t2); t1.start(); t2.start(); class MyThread3 extends Thread MyThread3(String s) super(s); public void run() for(int i=1; i=100; i+) System.out.println(getName() + : + i); if(i%10 = 0) yield(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 18 页 - - - - - - - - - 3、Priority TsetPriority.javapublic class TestPriority public static void main(String args) Thread t1 = new Thread(new T1(); Thread t2 = new Thread(new T2(); t1.setPriority(Thread.NORM_PRIORITY + 3); t1.start(); t2.start(); class T1 implements Runnable public void run() for(int i=0; i100; i+) System.out.println(T1: + i); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 18 页 - - - - - - - - - class T2 implements Runnable public void run() for(int i=0; i100; i+) System.out.println(T2: + i); 9.5 线程同步 _1 TestSync.java public class TestSync implements Runnable Timer timer = new Timer(); public static void main(String args) TestSync test = new TestSync(); Thread t1 = new Thread(test); Thread t2 = new Thread(test); t1.setName(t1); t2.setName(t2); t1.start(); t2.start(); public void run() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 18 页 - - - - - - - - - timer.add(Thread.currentThread().getName(); class Timer private static int num = 0; public void add(String name) num +; try Thread.sleep(1); catch(InterruptedException e) System.out.println(name + , 你是第 + num + 个使用 timer 的线程 ); 9.6 线程同步 _2 线程同步1、在 java 语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性,每个对象都对应于一个可称为“互斥锁”的标记,这个标记保证在任一时刻的互斥锁联系。当某个对象synchronized 修饰时,表明该对象在任一时刻只能由一个线程访问。2、关键字synchronized 来与对象的互斥锁联系。当某个对象synchronized 修饰时,表明该对象在任一时刻只能由一个线程访问。synchronized 的使用方法synchronized(this) / 锁定当前对象num +; try Thread.sleep(1); catch(InterruptedException e) System.out.println(name + , 你是第 + num + 个使用 timer 的线程 ); Synchronized 还可以放在方法声明中,表示整个方法为同步方法,例如public synchronized void add(String name) /执行这个方法当前对象被锁定TestSync.java public class TestSync implements Runnable Timer timer = new Timer(); public static void main(String args) TestSync test = new TestSync(); Thread t1 = new Thread(test); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 18 页 - - - - - - - - - Thread t2 = new Thread(test); t1.setName(t1); t2.setName(t2); t1.start(); t2.start(); public void run() timer.add(Thread.currentThread().getName(); class Timer private static int num = 0; public synchronized void add(String name) /执行这个方法当前对象被锁定/synchronized(this) / 锁定当前对象num +; try Thread.sleep(1); catch(InterruptedException e) System.out.println(name + , 你是第 + num + 个使用 timer 的线程 ); / 9.7 线程同步 _3 解决死锁的思路:把锁扩大,s 锁的力度加大,不要锁类中的对象,可一个把一个类都锁了!TesetDeadLock.java public class TestDeadLock implements Runnable public int flag = 1; static Object o1 = new Object() , o2 = new Object(); public void run() System.out.println(flag= + flag); if(flag = 1) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 18 页 - - - - - - - - - synchronized(o1) try Thread.sleep(500); catch(Exception e) e.printStackTrace(); synchronized(o2) System.out.println(1); /synchronized if(flag = 0) synchronized(o2) try Thread.sleep(500); catch(Exception e) e.printStackTrace(); synchronized(o1) System.out.println(0); /synchronized public static void main(String args) TestDeadLock td1 = new TestDeadLock(); TestDeadLock td2 = new TestDeadLock(); td1.flag = 1; td2.flag = 0; Thread t1 = new Thread(td1); Thread t2 = new Thread(td2); t1.start(); t2.start(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 18 页 - - - - - - - - - 9.8 线程同步 _4 一个 java 面试题public class TT implements Runnable int b = 100; public synchronized void m1()throws Exception b = 1000; Thread.sleep(5000); System.out.println(b = + b); public void m2() System.out.println(b); public void run() try m1(); catch (Exception e) e.printStackTrace(); public static void main(String args) throws Exception TT tt = new TT(); Thread t = new Thread(tt); t.start(); Thread.sleep(1000);/ 保证 t 启动tt.m2();/m2 会执行嘛?打印的结果是多少呢? 程序中只锁定了m1 方法,别的线程不可以访问m1 方法了!而m2 没有锁定可以访问!并且 b 的值已经改变!m2 可以拿到!9.9 线程同步 _5 面试题思考:public class TT implements Runnable int b = 100; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 18 页 - - - - - - - - - public synchronized void m1()throws Exception b = 1000; Thread.sleep(5000); System.out.println(b = + b); public void m2() throws Exception Thread.sleep(2500); b = 2000; public void run() try m1(); catch (Exception e) e.printStackTrace(); public static void main(String args) throws Exception TT tt = new TT(); Thread t = new Thread(tt); t.start(); tt.m2(); 最好 m1 方法打印的b 是多少呢?答案是 2000!这个好理解!如果我们这样改!public class TT implements Runnable int b = 100; public synchronized void m1()throws Exception System.out.println(Enter m1-); b = 1000; System.out.println(Enter m1-change b); Thread.sleep(5000); System.out.println(b = + b); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 18 页 - - - - - - - - - public synchronized void m2() throws Exception System.out.println(Enter m2-); Thread.sleep(2500); b = 2000; System.out.println(Enter m2-change b); public void run() try m1(); catch (Exception e) e.printStackTrace(); public static void main(String args) throws Exception TT tt = new TT(); Thread t = new Thread(tt); t.start(); /Thread.sleep(1000);(*)tt.m2(); System.out.println(tt.b); 如果我们把 *号式加上则这就说明了synchronized 关键字锁定了资源 b !如果两个方法都是synchronized 则 锁定了相同的资源, 需要等另一个锁解锁后才能使用!名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 18 页 - - - - - - - - - 9.10 线程同步 _6 只读可以不上锁!只写必须上锁!9.11 线程同步 _7 生产者消费问题两个方法访问同一个对象,则两个方法都应该加同步!两个锁定的方法拥有相同的资源,只有等一个方法离开方法,另一个方法才能访问另一个函数!上代码:public class ProducerConsumer public static void main(String args) SyncStack ss = new SyncStack(); Producer p = new Producer(ss); Consumer c = new Consumer(ss); new Thread(p).start(); new Thread(c).start(); class WoTou int id; WoTou (int id) this.id = id; public String toString() return WoTou: + id; class SyncStack int index = 0; WoTou arrWT = new WoTou6; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 18 页 - - - - - - - - - public synchronized void push(WoTou wt) / 装一个进去while(index = arrWT.length) try this.wait();/ 当前的正在我这个对象访问的线程wait /wait 锁不归我所有了,而sleep 还在抱着这个锁!catch(InterruptedException e) e.printStackTrace(); this.notify(); arrWTindex = wt; index+; public synchronized WoTou pop () / 取一个出来while(index = 0) try this.wait(); catch(InterruptedException e) e.printStackTrace(); this.notify();/ 叫醒一个正在我这个对象wait 的线程index-; return arrWTindex; class Producer implements Runnable SyncStack ss = null; Producer(SyncStack ss) this.ss = ss; public void run() for(int i = 0; i 20; i+) WoTou wt = new WoTou(i); ss.push(wt); System.out.println( 生产了 : + wt); try Thread.sleep(int)Math.random()*1000); catch (InterruptedException e) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 18 页 - - - - - - - - - class Consumer implements Runnable SyncStack ss = null; Consumer(SyncStack ss) this.ss = ss; public void run() for(int i = 0; i 20; i+) WoTou wt = ss.pop(); System.out.println( 消费了 : + wt); try Thread.sleep(int)Math.random()*1000); catch (InterruptedException e) WoTou 类,就是馒头类,提供了馒头的ID 和 toString 方法!SyncStack ,箩筐类,提供了放WoTou 的容器!有个WoTou 类数组,大小为6,提供了装一个WoTou 类对象和取一个WoTou 类对象,并且符号先进先出的思想,即栈!而 pop 取的时候发现SyncStack 中无 WoTou 对象可以去时,就调用Object 的 wait 方法,使调用线程进入了等待状态!直到其中有WoTou 对象(是因为push 函数往里装)。public synchronized WoTou pop () / 取一个出来while(index = 0) try this.wait(); catch(InterruptedException e) e.printStackTrace(); this.notify();/ 叫醒一个正在我这个对象wait 的线程index-; return arrWTindex; 当 push放一个 WoTou 对象时,如果发现了箩筐是满的,就 wait 使调用线程进入等待状态,只要不满(不满是因为pop 函数的调用使index 减少!) ,才会往里放!public synchronized void push(WoTou wt) / 装一个进去while(index = arrWT.length) try this.wait();/ 当前的正在我这个对象访问的线程wait /wait 锁不归我所有了,而sleep 还在抱着这个锁!名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 18 页 - - - - - - - - - catch(InterruptedException e) e.printStackTrace(); this.notify(); arrWTindex = wt; index+; Producer 类,生产者类,是一个支持多线程的类,负责每隔随机时间生产WoTou!在调用箩筐的 push 方法,把馒头放到箩筐中!Consumer 类,消费者类,也是一个支持多线程的类,负责每隔随机时间消费WoTou!调用的是箩筐的pop 方法,从箩筐中取出一个馒头!如果我们设置几个Producer 、Consumer 则我们需要this.notifyAll(); 方法来唤醒所有等待的线程,而这些线程谁强到那把锁,谁就执行!这就是经典的生产者消费者例子!名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 18 页 - - - - - - - - -

    注意事项

    本文(2022年马士兵_JAVA视频教程_JSE_._第章_线程 .pdf)为本站会员(Q****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开