电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

java并發編程專題(二)----如何創建并運行java線程

瀏覽:4日期:2022-08-30 09:31:24

實現線程的兩種方式

上一節我們了解了關于線程的一些基本知識,下面我們正式進入多線程的實現環節。實現線程常用的有兩種方式,一種是繼承Thread類,一種是實現Runnable接口。當然還有第三種方式,那就是通過線程池來生成線程,后面我們還會學習,一步一個腳印打好基礎。

Runnable接口:

public interface Runnable { public abstract void run();}

Thread類:

public class Thread implements Runnable { public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); boolean started = false; try { start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { /* do nothing. If start0 threw a Throwable then it will be passed up the call stack */ } } @Override public void run() { if (target != null) { target.run(); } }}

上面為Thread類和Runnable類的源碼,我們可以看到Thread類也是實現了Runnable接口,即Thread是Runnable的實現,那么他們到底在實現多線程上有什么區別呢?Thread和Runnable解析:

(1)Runnable接口:

Runnable接口是java中線程的定義類。所有線程都是通過該接口來實現,該接口中的run()方法為實現方法,即線程所要實現的內容寫入該方法里面,當線程啟動時會調用該方法。在大多數情況下,如果只想重寫run()方法而不重寫其他方法,應使用Runnable接口。

public class ThreadDemo3 { public static void main(String[] args) { //new了兩個線程對象——s1和s2 //其中兩個對象各對應一個內存區域。線程運行過程中運行都是自己內存塊中的數據 Shop1 s1 = new Shop1('小武'); s1.start(); Shop1 s2 = new Shop1('小潘'); s2.start(); /* //實例化了兩個線程對象,所以分配了兩塊內存空間 //執行過程中操作的是自己的內存空間 Shop2 s3 = new Shop2('小武'); s3.run(); Shop2 s4 = new Shop2('小潘'); s4.run(); //實際實例化了兩個線程對象 //所以同樣分配兩個內存空間 Thread t1 = new Thread(new Shop2('小武')); t1.start(); Thread t2 = new Thread(new Shop2('小潘')); t2.start(); */ //創建了兩個線程對象,但是使用的是同一個對象——s6 Shop2 s5 = new Shop2('w'); Shop1 s6 = new Shop1('T'); Thread t3 = new Thread(s6); t3.start(); Thread t4 =new Thread(s6); t4.start(); }}/** * 武大郎賣燒餅(因為業務的拓展,現在可以實現多窗口的出售) * 要求:每天只賣10個 * */class Shop1 extends Thread{ //private int count = 10; //使用靜態變量可以有效的實現資源共享(因為在內存中只有一份count) private static int count = 10; public Shop1(String name) { super(name); } public void run(){ //判斷是否已經賣完 while(count>0){ count--; System.out.println(this.getName() +'賣出了一個燒餅' + ',現在剩余' + count); } }}/** * 使用接口實現上面的代碼 * */class Shop2 implements Runnable{ //私有變量,存儲剩余燒餅的個數 private int count = 10; //存儲當前人的姓名 private String name=''; public Shop2(String name) { this.name = name; } /** * 實現銷售的方法 */ public void run(){ //判斷是否已經賣完 while(count>0){ count--; System.out.println(Thread.currentThread().getId() + '、' + this.name +'賣出了一個燒餅' + ',現在剩余' + count); } }}

(2)Thread類:

Thread類是Runnable接口的實現,jdk給我們提供了一個不用我們去想如何實現線程的方式供我們使用。同樣你在繼承Thread類的時候也需要重寫run()方法來實現你想在線程中實現的內容。

public class Test{ public static void main(String[] args) { //傳統方式——單任務方式 /* SimpleClass sc1 = new SimpleClass(); sc1.say('Mike'); SimpleClass sc2 = new SimpleClass(); sc2.say('Han Meimei'); */ //創建一個線程 ThreadClass tc1 = new ThreadClass('Mike'); //啟動線程 tc1.start(); //創建一個線程 ThreadClass tc2 = new ThreadClass('Han Meimei'); tc2.start(); } } } class SimpleClass{ public void say(String name){ while(true){ System.out.println('Hi,Im ' + name); } } } class ThreadClass extends Thread{ public ThreadClass(String name) { super(name); } /** * 將父類(Thread)的run()方法進行重寫 * 在run()方法中包含了需要執行的代碼 */ public void run(){ while(true){ System.out.println('Hi,Im ' + this.getName() + '|' + this.getId() + '|' + this.getStackTrace()); } } }

Thread類中常用方法:

run():如果該線程時使用獨立的Runnable運行對象構造的,則調用該Runnable對象的run方法。否則,該方法不執行任何操作并返回。sleep(longmillls):在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行),此操作受到系統計時器和調度程序精度和準確性的影響 Stringyield():暫停當前正在執行的線程對象,并執行其他線程 start():使該線程開始運行,java虛擬機再調用該線程的run方法join():等待該線程結束

對比:

上面給出了Thread和Runnable的實現,我們能看到在使用Runnable的方式實現線程的過程中:

Shop1 s6 = new Shop1('T'); Thread t3 = new Thread(s6); t3.start();

即把Runnable對象(實現了Runnable接口的對象)還是塞進了Thread中讓Thread來實現。那么我們可以new 多個Thread來實現同一個Runnbale對象,即實現了資源的共享,比如在售票系統中多名用戶對同一種票的搶購。另一方面,java是單繼承多實現的,如果我們使用Thread的話意味著該類只能繼承Thread,對于程序的擴展不利,而實現Runnbale接口則沒有這個顧慮。考慮程序的健壯性,我們應該盡量使用Runnable來實現我們的線程。

run和start

初學多線程我們總是分不清楚run()方法和start()方法的區別,其實我們再看一下上面Thread類的源碼就不難發現他們的用法是很容易區分的:

run()方法是線程的實現方法,即你需要線程去做什么事情,那么這些實現的內容寫在run()里面,當線程啟動時就會調用run()方法繼而實現run()內部的代碼; start()方法是線程的啟動方法,即如果你new Thread()這樣并不算完。你還得new Thread().start()才算啟動這個線程,啟動完之后線程內部會主動的調用run()方法執行該線程的業務邏輯代碼。

以上就是java并發編程專題(二)----如何創建并運行java線程的詳細內容,更多關于JAVA 創建并運行java線程的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 桌上式超净工作台-水平送风超净工作台-上海康路仪器设备有限公司 | 宜兴市恺瑞德环保科技有限公司| 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 广东护栏厂家-广州护栏网厂家-广东省安麦斯交通设施有限公司 | 东莞工厂厂房装修_无尘车间施工_钢结构工程安装-广东集景建筑装饰设计工程有限公司 | 干法制粒机_智能干法制粒机_张家港市开创机械制造有限公司 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | PAS糖原染色-CBA流式多因子-明胶酶谱MMP-上海研谨生物科技有限公司 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 国际线缆连接网 - 连接器_线缆线束加工行业门户网站 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | VOC检测仪-甲醛检测仪-气体报警器-气体检测仪厂家-深恒安科技有限公司 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 海尔生物医疗四川代理商,海尔低温冰箱四川销售-成都壹科医疗器械有限公司 | 灰板纸、灰底白、硬纸板等纸品生产商-金泊纸业 | 报警器_家用防盗报警器_烟雾报警器_燃气报警器_防盗报警系统厂家-深圳市刻锐智能科技有限公司 | 氧化铁红厂家-淄博宗昂化工| 走心机厂家,数控走心机-台州博城智能科技有限公司 | 上海网站建设-上海网站制作-上海网站设计-上海做网站公司-咏熠软件 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 扒渣机,铁水扒渣机,钢水扒渣机,铁水捞渣机,钢水捞渣机-烟台盛利达工程技术有限公司 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | [官网]叛逆孩子管教_戒网瘾学校_全封闭问题青少年素质教育_新起点青少年特训学校 | 防腐木批发价格_深圳_惠州_东莞防腐木厂家_森源(深圳)防腐木有限公司 | 浙江筋膜枪-按摩仪厂家-制造商-肩颈按摩仪哪家好-温州市合喜电子科技有限公司 | 碳钢法兰厂家,非标法兰,定制异型,法兰生产厂家-河北九瑞管道 | 综合管廊模具_生态,阶梯护坡模具_检查井模具制造-致宏模具厂家 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 | 天坛家具官网 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 礼堂椅厂家|佛山市艺典家具有限公司 | 青岛侦探调查_青岛侦探事务所_青岛调查事务所_青岛婚外情取证-青岛狄仁杰国际侦探公司 | 电动手术床,医用护理床,led手术无影灯-曲阜明辉医疗设备有限公司 | 高压油管,液压接头,液压附件-烟台市正诚液压附件 | 北京网站建设|北京网站开发|北京网站设计|高端做网站公司 | 车件|铜件|车削件|车床加工|五金冲压件-PIN针,精密车件定制专业厂商【东莞品晔】 | 三氯异氰尿酸-二氯-三氯-二氯异氰尿酸钠-优氯净-强氯精-消毒片-济南中北_优氯净厂家 |