Java语言系统多线程_第1页
Java语言系统多线程_第2页
Java语言系统多线程_第3页
Java语言系统多线程_第4页
Java语言系统多线程_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、多线程.进程和线程的概念1、进程:运行中的程序。一个进程中可以包含多个线程,可以同时运行。2、进程:执行中程序(程序是静态的概念,进程是动态的概念)。3、多线程指的是在单个程序中可以同时运行多个不同的线程执行不同的任务。多线程编程 的目的就是“最大限度地利用cpu资源,当某一线程的处理不需要占用cpu而只和10 等资源打交道时,让需要占用cpu资源的其他线程有机会获得cpu资源。4、java中如果我们自己没有产生线程,那么系统会给我们自动产生一个线程(主线程,main 方法就在主线程上运行),我们的程序都是由线程来执行的。二、线程的实现方式 一个进程可以包含一个或多个线程 一个程序实现多个代码

2、同时交替运行就需要产生多个线程 cpu随机的抽出时间,让我们的程序一会做这件事情,一会做另一件事情1. 廉j进程的釘e务处理是更熟悉的形式。中!( process)本质卜是-个执行的相庁。因此基于进 程的多任务处理的特点是允许你的i i 口机同时运行 两个或更多的程序。举例来说.基于进程的多任务 处理使你在运用文本编侏器的时候可以同时运疔 java编译器在基f进程的多任务处理中程序是 调度程序所分派的般小代码单位。2. 而任基线稈(thread-based)的多任务处理坏 境中.线程足衆小的执行职位。这总味若一个程【匚i t以同时执行两个或者多个任务的功能例如讥亠 个文本编辑器可以在打卬的同时

3、恪式牝1传务线程程序比多进程程序需要更少的管理费 用g进程是皿代级的任务,謂耍分配给它们独址的地址空间。进程间通信是昂贵和受限 的。进程间的转换也是很需要花费的。另方面.线程是轻横级的选手。它们共享相同的地址空间并il共同分7同一个进程。线程间通信是便宜的 的。线程间的转换也是僱麽心、亠v、耀理的牢现/oavaqi通过un方法为线程指明要完成的任务. 冇两种技术来为线程提供un方法。1.继承thread类并逼写run方法1、线程的实现有两种方式:第一种方式是继承thread类,然后重写nm方法; 第二种是实现runnable接口,然后实现run方法。2、将我们希望线程执行的代码放到run方法中

4、,然后通过start方法来启动线 程。start方法首先为线程的执行准备好系统资源,然后再去调用run方法。 当某个类继承了 thread类之后,该类就叫做一个线程类。示例:方法一:继承thread类public class threadtest public static void main(string args) threadl tl=new threadl();tl.starto;/必须调用start方法才能以线程的方式启动,run方法做不到 thread2 t2=new thread2();t2start();class threadl extends threadfstring n

5、ame;/threadl(string name)/ thisname=name;/(3 overridepublic void run ()for(int i=0;i<100;i+)system.out.printin(nhello world:h+i);class thread2 extends threadoverridepublic void run()for(int i=0;i<100;i+)system, out.printin ( nhello ccit: l! + i);3、一个进程至少要包含一个线程4、对于单核cpu来说,某一时刻只能有一个线程在执行(微观串行),

6、从宏观 角度来看,多个线程在同时执行(宏观并行)。5、对于双核或双核以上的cpu来说,可以真正做到微观并行。示例:方法二:实现runnable接口public class threadtest2 public static void main(string args) mythread mt=new mythread();thread t=new thread();/ thread t=new thread(new mythread();tstart ();class mythread implements runnab1e(overridepublic void run ()for(int

7、i=0;i<100;i+)system. out. printin ( hhello : 11+ i);改写成内部类:public class threadtest2 public static void main(string args) thread t=new thread(new runnable()overridepublic void run ()for(int i=0;i<100;i+)system, out .printin ( nhello : ,f + i););tstart ();public class threadtest2 public static v

8、oid main(string args) thread t=new thread(new mythread();tstart ();thread t2=new thread(new mythread2();t2start ();class mythread implements runnaoverridepublic void run()for(int i=0;i<100;i+)system, out .printin (,!hello : ,f + i);6、thread类也实现了 runnable接口,因此实现runnable接口中的run方法; 上例中:public class

9、threadtest2 public static void main(string args) thread t=new thread(new mythread();system.out.printin(t.getname();t start ();thread t2=new thread(new mythread2();system.out.printin(t2.getname();t2start ();线程名字:thread-0thread-17、当生成一个线程对象时,如果没有为其设定名字,那么线程对象的名字将使用如下 形式:thread-number,该number将是自动增加的,并被

10、所有的thread对象所共 享(因为它是static的成员变量)8、当使用第一种方式来生成线程对象时,我们需要重写run方法,因为thread类的 run方法此时什么事情也不做。9、当使用第二种方式来生成线程对象时,我们需要实现runnable接口的rim方法, 然后使用 new thread (new mythread ()(假女li mythread 己经实现了 runnable 接口)来生成线程对象,这时的线程对象的run方法就会调用mythread类的run方 法,这样我们自己编写的run方法就执行了。public class threadtest public static void

11、 main(string args) threadl tl=new threadl ('* f irst thread");tl. start () ; /必须调用start方法才能以线程的方式启动,run方法做不到threadl t2=new threadl ("second thread'*);t2 start ();class threadl extends thread/string name;threadl(string name)super(name);overridepublic void run()for(int i=0;i<10;i+

12、)system.out.printin(this getname()+i);启动、睡眠public class threadtest public static void main(string args) threadl tl=new threadl (11 first thread11);tl. start () ; /必须调用start方法才能以线程的方式启动,run方法做不到 class threadl extends thread! /string name;threadl(string name) super(name);overridepublic void run()for(i

13、nt i=0;i<10;i+)system.out.printin(thisgetname()+i); try thread.sleep(1000); catch (interruptedexception e) / todo autoggnerated catch block e.printstacktrace ();课堂实践:设计一个时钟显示器线理的牢珂总结:1.前种方法均需执行线程的start方法为线程分配 必须的系统资源、调度线程运行井执行线程的 nun方法。:种方法来构造即实现;口。3.线卅的讣是让 run()/jh2. 在隽体应用中,采用哪种方法来构造线程体要 觇情况而定。通

14、常当个线程已继承了另- 个类时,¥ ! rurw able体片靖理榨養旳初才"v4* qxin. 八l.r :“public class mythread iniplcaicnts runnable ( private boolean tlag*tru«:public void run (>c while (flag)iibllc void stofjrunning (>i f l.ig false;)»public class controlthread( privnti* runnable r-new mythrrad (i; priva

15、te thread t-new thread(r);public void staitthread()publ i void stopthreado i r. :of running ();)三线程的生命周期及优先级1、创建状态:new2、可运行状态:start3、不可运行状态:sleep,wait,阻塞等4、消亡状态:run方法结束后,自然消亡线程的状态转换图:1.线程的优枠及其设汽设 mrwbwwr线个线程的优先级设用遵从以f原则:-线程创建时.子继承父的优先级-线程创建肯,可通过调用set priority ()方 法改变优先级。-线程的优先级址110之间的疋整為1 min_priori

16、ty,10 - max_priority5 norm priority线程的执行并不完全由优先级决定,更多的由底层的操作系统执行。底层的 操作系统会动态改变线程的优先级,等待时间长的优先级会增加,这个由操作系 统决定。h线程的调度策略戏程需評黙魏蠶體劈行但崽如果发生以线程体中m ryieldo方心 让出对cpu的占用权 线胃体中调用fsleepo方法,使线稈进入睡眠状态 线程由于i/o操作而受阻塞 另-个更高优先级的线程出现 任支持时何片的系统中该线程的也同最后一条主要在”分时系统中。线程的同步public class threadtest public static void main(st

17、ring args) runnable runnable=new heliotread();thread tl=new thread (runnabl_e);thread t2=new thread(runnable);11start ();t2start ();class heliotread implements runnaint i;/成员变量,结果是50个qpverridepublic void run ()/int i=0;/局部变量:和定义在成员变量时的i比较一下,结果是100个while(true)system. out: printin (”number: ”+ i+);try

18、 thread sleep(long) (math.random()*1000); catch (interruptedexception e) / todo auto-gecatch blockeprintstacktrace ();if(50=i) break;1、关于成员变量与局部变量,如果一个变量是成员变量,那么多个线程对同一个对象 的成员变量进行操作时,他们对该成员变量是彼此影响的,(出就是说一个线程对 成员变量的改变会影响到另一个线程)。2、如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝,一 个线程对该局部变量的改变不会影响其他线程。改变上例:public stat

19、ic void main(sargs) runnable runnable=new hellotread();thread tl=new thread(runnable);runnab1e=new hellotread();thread 12=new thread (runnabl_e);11start (); t2start ();100 个。3、停止线程的方式不能使用thread类的stop方法来终止线程的执行,一般耍 设定一个变量,在run方法中是一个循环,循环每次检查该变量,在run方 法中是一个循环,循环每次检查该变量,如果满足条件则继续执行,否则跳 出循环,线程结束。4、不能依靠的

20、优先级來决定线程的执行顺序。示例:银行取款public class fetchmoney public static void main(string args) bank bank=new bank();moneythread tl=new moneythread(bank); moneythread t2=new moneythread(bank); tl. start ();t2start ();class bankprivate int money=1000;public int getmoney(int number)if(number<=0 )return -1;else i

21、f(number>this.money)return -2;else if(money<0)return -3;else try thread.s丄eep(1000); catch (interruptedexception e) / todo auto-generated catch block eprintstacktrace();money-=number;system.out.printin(money);return number;class moneythread extends threadprivate bank bank;public moneythread(ba

22、nk bank) super();this.bank = bank;(overridepublic void run ()system.out.printin(bank.getmoney(800);最后剩-600.改:public static void main(string args) bank bank=new bank();moneythread tl=new moneythread(bank);bank=new bank();moneythread t2=new moneythread(bank);tlstart();t2start();相当于2个账户,都剩200再改:private

23、 static int money=1000;贝lj要么,200, -600,要么-600, -600在最初的代码中修改:public synchronized int getmoney(int number)结果:200800-2synchronized关键字:当synchronized关键字修饰一个方法的时候,该方法 叫做同步方法。上锁解锁。6、java屮的每个对彖都有一个锁(lock)或者叫做监视器(monitor),当访问某 个对象的synchronized方法吋,表示将该对彖上锁,此时其他任何线程都无法 再去访问该synchronized方法了,直到之前那个线程执行方法完毕后或抛出了

24、 异常,那么将该对象的锁释放掉,其他线程才有可能再去访问该synchronized 方法。public class threadtest4 public static void main(string args) example example=new example();thread tl=new thethread(example);thread t2=new thethread2(example);tl start ();t2start();class examplepublic synchronized void execute()for(int i=0;i<10;i+)try

25、thread.sleep(500); catch (interruptedexception e) / todo auto-generated catch block e.printstacktrace();system. out .printin ( "example : + i);public synchronized void execute2 () for(int i=0;i<10;i+)try thread.s丄eep(500); catch (interruptedexception e) / todo auto-generated catch block e.pr

26、intstacktrace ();system.out.printin(njava:n+i);class thethread extends thread!private example example;public thethread(example example) super();this.example = example;overridepublic void run()thisexample.execute();class thethread2 extends threadprivate example example;public thethread2(example examp

27、le) this.example = example;(overridepublic void run ()thisexample.execute2();调用仍然顺序,因为是给对彖上锁的。7、如果一个对象有多个synchronized方法,某一时刻某个线程已经进入到了某个 synchronized方法,那么在该方法没有执行完毕z前,其他线程是无法访问该对 象的任何一个synchronized方法的(非synchronized方法不影响)。改上例:public static void main(string args) example example=new example();thread t

28、l=new thethread(example);example=new example();thread t2=new thethread2(example);tl start ();t2start ();则无序。public class threadtest4 public static void main(string args) example example=new example();thread tl=new thethread(example);example=new example();thread t2=new thethread2(example);tlstart ();

29、t2start ();class examplepublic synchronized static void execute()for(int i=0;i<10;i+)try thread.sleep(500); catch (interruptedexception e) / todo auto-generated catch block e.printstacktrace ();system.out.printin(nexample:h + i);public synchronized static void execute2 () for(int i=0;i<10;i+)t

30、ry thread.sleep(500); catch (interruptedexception e) / todo auto-generated catch block e.printstacktrace();sys tem. out .pri nt in (11 java: 11+ i);class thethread extends threadprivate example example;public thethread(example example) super();this.example = example;0overridepublic void run()thisexa

31、mpleexecute();class thethread2 extends thread private example example;public thethread2(example example) this.example = example;(overridepublic void run ()thisexample.execute2();如果某个synchronized方法是static的,那么当线程访问该方法时,它锁的并不是 synchronized方法所在的对象,而是synchronized方法所在的对象所对应的class对象, 因为java中无论一个类有多少个対象,这些对

32、象会对应唯一一个class对象,因此当线 程分别访问同一个类的两个对象的两个static, synchronized方法时,他们的执行顺序也 是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始执行。2、上一讲中同步上锁方法也可为如下方式:synchronized 块:class example2private object object=new object();public void execute()synchronized (object) /synchronized, 给object 上锁 for(int i=0;i<10;i+)try thread sj.eep

33、 (500); catch (interruptedexception e) / todo auto-generated catch blocke.printstacktrace ();system out printin("example:” + i);public void execute2()synchronized (object)for(int i=0;i<10;i+)try thread.sleep(500); catch (interruptedexception e) / todo auto-generated catch blocke.printstacktr

34、ace ();system out printin("java:” + i);synchronized 块:语法 syn chr on ized(object) 表示线程会对object上锁。3、synchronized方法是一种粗粒度的并发控制,某一时刻,只能有一个线程执行该 synchronized方法,synchronized块则是一种细粒度的并发控制,只会将块屮的代码同步, 位于方法内、synchronized块之外的代码是可以被多个线程同吋访问到的。线程间通信:public class deadlocktest public static void main(string args) sample sample=new sample();increa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论