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

上传人:Q****o 文档编号:31711505 上传时间:2022-08-08 格式:PDF 页数:18 大小:649.82KB
返回 下载 相关 举报
2022年马士兵_JAVA视频教程_JSE_._第章_线程 .pdf_第1页
第1页 / 共18页
2022年马士兵_JAVA视频教程_JSE_._第章_线程 .pdf_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《2022年马士兵_JAVA视频教程_JSE_._第章_线程 .pdf》由会员分享,可在线阅读,更多相关《2022年马士兵_JAVA视频教程_JSE_._第章_线程 .pdf(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第九章线程9.1 线程的基本概念1、线程是一个程序内部的顺序控制流(线程是一个程序中不同的执行路径) 。2、线程和进程的区别a)每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销。b)线程可以看成轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。c)多进程:在操作系统中能同时运行多个任务(程序)。d)多线程:在同一应用程序中能有多个顺序同时执行。3、Java的线程是通过 jva.lang.Thread类来实现的。4、VM 启动时会有一个由主方法(public static void main() 所定义的线程。5、可以通过创建

2、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方法启动,但

3、这样就是方法的调用,而不是多线程!真正的是调用 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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - -

4、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 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 s

5、tatic 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 = n

6、ew 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); 名师资料总结 - -

7、-精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 18 页 - - - - - - - - - 9.2 Sleep方法1、线程的状态2、线程控制基本方法4、sleep/join/yield 方法名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 18 页 - - - - - - - - - sleep: 1)可以调用Thread 的静态方法public static void

8、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

9、 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

10、 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()

11、; 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) retu

12、rn ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 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 MyThr

13、ead3 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 cla

14、ss 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); 名师资料总结 - - -精品资料

15、欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 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

16、 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 页 - - - - - - - - - t

17、imer.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 语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性,每个对象都对应于一个可称为“互斥锁”的

18、标记,这个标记保证在任一时刻的互斥锁联系。当某个对象synchronized 修饰时,表明该对象在任一时刻只能由一个线程访问。2、关键字synchronized 来与对象的互斥锁联系。当某个对象synchronized 修饰时,表明该对象在任一时刻只能由一个线程访问。synchronized 的使用方法synchronized(this) / 锁定当前对象num +; try Thread.sleep(1); catch(InterruptedException e) System.out.println(name + , 你是第 + num + 个使用 timer 的线程 ); Synchr

19、onized 还可以放在方法声明中,表示整个方法为同步方法,例如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); 名师资料总结 - - -精品资料欢迎下载 - - - - -

20、 - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 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(Stri

21、ng 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 fl

22、ag = 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.pri

23、ntStackTrace(); 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(); TestDea

24、dLock 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 implement

25、s 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 =

26、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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -

27、 - - - - - 第 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

28、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(Ente

29、r 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.printl

30、n(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

31、!如果两个方法都是synchronized 则 锁定了相同的资源, 需要等另一个锁解锁后才能使用!名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 18 页 - - - - - - - - - 9.10 线程同步 _6 只读可以不上锁!只写必须上锁!9.11 线程同步 _7 生产者消费问题两个方法访问同一个对象,则两个方法都应该加同步!两个锁定的方法拥有相同的资源,只有等一个方法离开方法,另一个方法才能访问另一个函数!上代码:public class ProducerCo

32、nsumer 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 in

33、dex = 0; WoTou arrWT = new WoTou6; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 18 页 - - - - - - - - - public synchronized void push(WoTou wt) / 装一个进去while(index = arrWT.length) try this.wait();/ 当前的正在我这个对象访问的线程wait /wait 锁不归我所有了,而sleep 还在抱着这个锁!catch(Interru

34、ptedException 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

35、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) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -

36、- 名师精心整理 - - - - - - - 第 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 (Interr

37、uptedException e) WoTou 类,就是馒头类,提供了馒头的ID 和 toString 方法!SyncStack ,箩筐类,提供了放WoTou 的容器!有个WoTou 类数组,大小为6,提供了装一个WoTou 类对象和取一个WoTou 类对象,并且符号先进先出的思想,即栈!而 pop 取的时候发现SyncStack 中无 WoTou 对象可以去时,就调用Object 的 wait 方法,使调用线程进入了等待状态!直到其中有WoTou 对象(是因为push 函数往里装)。public synchronized WoTou pop () / 取一个出来while(index = 0

38、) 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 t

39、his.wait();/ 当前的正在我这个对象访问的线程wait /wait 锁不归我所有了,而sleep 还在抱着这个锁!名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 18 页 - - - - - - - - - catch(InterruptedException e) e.printStackTrace(); this.notify(); arrWTindex = wt; index+; Producer 类,生产者类,是一个支持多线程的类,负责每隔随机时间生产

40、WoTou!在调用箩筐的 push 方法,把馒头放到箩筐中!Consumer 类,消费者类,也是一个支持多线程的类,负责每隔随机时间消费WoTou!调用的是箩筐的pop 方法,从箩筐中取出一个馒头!如果我们设置几个Producer 、Consumer 则我们需要this.notifyAll(); 方法来唤醒所有等待的线程,而这些线程谁强到那把锁,谁就执行!这就是经典的生产者消费者例子!名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 18 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

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

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