創(chuàng)建線程

      網(wǎng)友投稿 559 2025-04-01

      今天學(xué)完了華為云課堂java多線程實(shí)戰(zhàn)中創(chuàng)建線程這一章,做一個(gè)小結(jié),鞏固新知


      一、進(jìn)程和線程的理解

      進(jìn)程和線程專業(yè)的術(shù)語(yǔ)我并不能記下來(lái),但是通過(guò)自己的理解也對(duì)兩者的關(guān)系和區(qū)別有了一定的認(rèn)識(shí)。

      首先介紹兩者關(guān)系。打開(kāi)任務(wù)管理器,可以看見(jiàn)已經(jīng)啟動(dòng)的應(yīng)用程序,每一個(gè)應(yīng)用程序就是一個(gè)進(jìn)程,比如qq。當(dāng)我們?cè)谑褂胵q的某些功能如語(yǔ)音、視頻時(shí),我們其實(shí)就是在使用qq的線程,也就是說(shuō)一個(gè)應(yīng)用程序就是一個(gè)進(jìn)程,而應(yīng)用程序中的各個(gè)功能就是線程。進(jìn)程和線程之間的關(guān)系就可以理解成父母和子女的關(guān)系,進(jìn)程是父母,線程則是子女。父母可以沒(méi)有子女而獨(dú)立存在,而子女的存在離不開(kāi)父母。

      兩者的區(qū)別可以從地址空間、資源擁有、執(zhí)行過(guò)程三反面描述,表格如下

      二、創(chuàng)建線程的五種方式

      1.繼承Thread()類

      通過(guò)繼承Thread()類并重寫run()方法,run()方法是中心方法,里面放著需要執(zhí)行的任務(wù),關(guān)鍵就是這個(gè)run()函數(shù)

      創(chuàng)建后的子類調(diào)用start()方法就可以執(zhí)行線程中的run()方法

      注意:這種繼承Thread()類創(chuàng)建的線程類,多個(gè)線程間無(wú)法共享線程類的實(shí)例變量

      public class UserThread extends Thread{ @Override public void run() { for(int i = 0;i<10;i++) { System.out.println(Thread.currentThread().getName()+"is running"+i); //得到正在執(zhí)行任務(wù)的線程的名稱 } } }

      public class UserThreadTest { public static void main(String[] args) { // TODO Auto-generated method stub Thread t1 = new UserThread();//通過(guò)繼承Thread類創(chuàng)建的線程類,線程不共享資源 Thread t2 = new UserThread(); t1.start(); t2.start(); //兩個(gè)線程同時(shí)執(zhí)行任務(wù) } }

      2.實(shí)現(xiàn)Runnable接口

      先定義一個(gè)類實(shí)現(xiàn)Runnable接口并重寫run()方法,run()是線程的執(zhí)行體,是關(guān)鍵方法

      創(chuàng)建Runnable實(shí)現(xiàn)類的對(duì)象

      創(chuàng)建Thread()對(duì)象,將先前創(chuàng)建的Runnable實(shí)現(xiàn)類的對(duì)象作為參數(shù)傳入到Thread()對(duì)象中,Thread()對(duì)象才是真正的線程對(duì)象

      注意:利用Runnable創(chuàng)建的線程類對(duì)象,線程可以共享資源

      public class UserRun implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i = 0;i<10;i++) { System.out.println(Thread.currentThread().getName()+"is Running"+i); } } }

      public class UserRunTest { public static void main(String[] args) { // TODO Auto-generated method stub UserRun userRun = new UserRun(); Thread t1 = new Thread(userRun); Thread t2 = new Thread(userRun); t1.start(); t2.start(); //兩個(gè)線程同時(shí)進(jìn)行 } }

      3.實(shí)現(xiàn)Callable接口實(shí)現(xiàn)帶有返回值的線程

      Callable接口相當(dāng)于Runnable接口的升級(jí)版,其中call()方法是執(zhí)行體,和run()方法作用相同,只不過(guò)帶有了返回值

      Callable對(duì)象不能作為Thread()的參數(shù),這是和Runnable的區(qū)別,Callable接口不是Runnable接口的子接口

      解決這個(gè)問(wèn)題,引入Future接口,這個(gè)接口可以接收call()的返回值,RunnableFuture接口是Future接口和Runnable接口的子接口,可以作為Thread對(duì)象的參數(shù)

      import java.util.concurrent.Callable; public class UserCallable implements Callable{ @Override public Object call() throws Exception { System.out.println(Thread.currentThread().getName()); return "學(xué)習(xí)"; } }

      import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; import java.util.concurrent.RunnableFuture; public class UserCallableTest { public static void main(String[] args) throws InterruptedException, ExecutionException { // TODO Auto-generated method stub UserCallable user = new UserCallable(); FutureTask ft = new FutureTask(user);//引入Future接口,可以作為Thread()的參數(shù),F(xiàn)uture接口可以接受call()的返回值 Thread t = new Thread(ft); t.start(); System.out.println(ft.get());//得到call()返回值 } }

      4.繼承TimerTask抽象父類

      Timer和TimerTask是可以產(chǎn)生線程類的方法。Timer是一種線程設(shè)施,可以調(diào)度TimerTask,安排后臺(tái)程序中執(zhí)行的任務(wù),任務(wù)可以執(zhí)行一次或定期重復(fù)執(zhí)行,相當(dāng)于一個(gè)定時(shí)器

      創(chuàng)建線程的步驟

      定義UserTask類繼承TimerTask

      創(chuàng)建UserTask對(duì)象

      創(chuàng)建線程

      創(chuàng)建Timer類對(duì)象,設(shè)置執(zhí)行策略

      import java.util.Date; import java.util.TimerTask; public class UserTask extends TimerTask{ @Override public void run() { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName()+"is running"+new Date()); } }

      import java.util.Timer; public class UserTaskTest { public static void main(String[] args) { // TODO Auto-generated method stub UserTask ut = new UserTask(); Timer t = new Timer(); t.schedule(ut, 2000, 1000); } }

      三、總結(jié)

      好啦,這部分就寫到這了,該去吃飯了,簡(jiǎn)單來(lái)說(shuō)這篇文章寫了進(jìn)程和線程的聯(lián)系和區(qū)別以及創(chuàng)建線程的幾種方法,重點(diǎn)是通過(guò)繼承Thread類創(chuàng)建線程類和實(shí)現(xiàn)Runnable接口創(chuàng)建線程類這兩種方法。收獲滿滿,繼續(xù)努力。

      Java 培訓(xùn)服務(wù)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:wps中字符距離怎么設(shè)置
      下一篇:wps流程圖箭頭怎么拐彎
      相關(guān)文章
      亚洲国产精品日韩| 亚洲剧场午夜在线观看| 亚洲第一香蕉视频| 丝袜熟女国偷自产中文字幕亚洲| AV激情亚洲男人的天堂国语| 亚洲人成人伊人成综合网无码| wwwxxx亚洲| 性xxxx黑人与亚洲| 亚洲乱码卡三乱码新区| 亚洲乱码中文字幕小综合| 亚洲另类春色国产精品| 亚洲最大福利视频| 国产日本亚洲一区二区三区 | 亚洲香蕉在线观看| 国产精品亚洲专区在线观看| 最新亚洲精品国偷自产在线| 亚洲午夜无码久久久久小说| 亚洲乱码日产精品一二三| 亚洲精品亚洲人成在线播放| 亚洲中文无码亚洲人成影院| 亚洲人成色99999在线观看| 亚洲爆乳无码精品AAA片蜜桃| 国产91成人精品亚洲精品| 亚洲午夜无码片在线观看影院猛 | 亚洲精品视频在线看| 国产日产亚洲系列| 亚洲成色在线综合网站| 亚洲91av视频| 亚洲图片校园春色| 亚洲深深色噜噜狠狠网站| 亚洲精品无码永久在线观看男男 | 色噜噜的亚洲男人的天堂| 亚洲国产综合精品一区在线播放| 亚洲一级Av无码毛片久久精品| 国产美女亚洲精品久久久综合| 亚洲成A∨人片在线观看不卡| 麻豆亚洲AV永久无码精品久久 | 亚洲国产精品人久久电影| 美女视频黄免费亚洲| 国产亚洲精品91| 国产亚洲人成网站观看|