欢迎来到天天文库
浏览记录
ID:30778905
大小:76.66 KB
页数:5页
时间:2019-01-03
《java并发编程(6):runnable和thread实现多线程的区别(含代码)-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Java并发编程(6):Runnable和Thread实现多线程的区别(含代码)-编程开发技术Java并发编程(6):Runnab1e和Thread实现多线程的区别(含代码)原文出处:兰亭风雨Java屮实现多线程冇两种方法:继承Thread类、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优势:1、可以避免由于Java的单继承特性而带來的局限;2、增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的;3、适合多个相同程序
2、代码的线程区处理同一资源的情况。下面以典型的买票程序(基木都是以这个为例了)为例,來说明二者的区别。首先通过继承Thread类实现,代码如下:classMyThreadextendsThread{privatcintticket二5;publicvoidrun(){for(inti=0;i〈10;i++){if(ticket>0){Systcm.out.printin("ticket二"+ticket--);}}}publicclassThreadDemo{publicstaticvoidmain(String[]args){n
3、ewMyThread().start();newMyThread()・start();newMyThread()・start();}}某次的执行结果如下:E:>jauacThreadDeno.jaua=4=3=2=1E:>jauaThreadDemoticketticketticketticketticketticketticketticketticketticketticketticketticketticketticket=4=3=2=1=4=3=2=1E:>搜狗拼音半:从结果中可以看岀,每个线程单独卖了5张票,即独立
4、地完成了买票的任务,但实际应用中,比如火车站售票,需要多个线程去共同完成任务,在木例中,即多个线程共同买5张票。下面是通过实现Runnable接口实现的多线程程序,代码如下:classMyThrcadimplcmcntsRurrnable{privateintticket=5;publicvoidrun(){for(inti=0;i<10;i++){if(tickct>0){Systein.out・println(〃tieket二〃+ticket一一);publicclassRunnableDemo{publicstaticvo
5、idmain(St:ring[]args){MyThrcadmy二newMyThrcad();newThread(my),start();newThread(my).start();newThread(my).start();某次的执行结果如下:CC:YIBD0TSsysteB32cBd.exeDE:>jauaRunnableDemoticket=5ticket=4rcicket=3ticket=1ticket=2搜狗拼音半:从结果屮可以看出,三个线程一共卖了5张票,即它们共同完成了买票的任务,实现了资源的共享。针对以上
6、代码补充三点:1、在第二种方法(Runnable)中,ticket输出的顺序并不是54321,这是因为线程执行的时机难以预测,ticket-并不是原了操作。2、在第一种方法中,我们new?3个Thread对象,即三个线程分别执行三个对彖中的代码,因此便是三个线程去独立地完成卖票的任务;而在笫二种方法中,我们同样也newT3个Thread对象,但只有一个Runnable对象,3个Thread对象共享这个Runnable对象中的代码,因此,便会出现3个线程共同完成卖票任务的结果。如果我们new出3个Runnable对象,作为参数分别
7、传入3个Thread对象屮,那么3个线程便会独立执行各自Runnable对象中的代码,即3个线程各自卖5张票。3、在第二种方法屮,由丁•3个Thread对彖共同执行一个Runnable对彖中的代码,因此可能会造成线程的不安全,比如可能ticket会输出-1(如果我们System,out-.语句前加上线程休眠操作,该情况将很有可能出现),这种情况的出现是曲于,一个线程在判断ticket为1>0后,还没有來得及减1,另一个线程已经将ticket减1,变为了0,那么接卜•來Z前的线程再将ticket减1,便得到了-1。这就需要加入同步
8、操作(即互斥锁),确保同一时刻只冇一个线程在执行每次for循环中的操作。而在第一种方法中,并不需要加入同步操作,因为每个线程执行自己Thread对象屮的代码,不存在多个线程共同执行同一个方法的情况。本系列:•Java并发编程(1)•Java并发编程(2)•Jav
此文档下载收益归作者所有