多線程Thread,Runnable,Callable實(shí)現(xiàn)方式
一、創(chuàng)建線程的常用三種方式
1、繼承Thread類
創(chuàng)建MyThread 類并繼承Thread
package com.zrrd.XianCheng; /** *繼承Thread類,達(dá)到線程的能力 */ public class MyThread extends Thread{ private String name; public MyThread(String name){ this.name=name; } @Override public void run() { for(int i=0;i<=100;i++){ System.out.println(name+"下載了"+i+"%"); } } }
創(chuàng)建測(cè)試類ThreadText 啟動(dòng)線程,執(zhí)行代碼塊
package com.zrrd.XianCheng; /** * 測(cè)試線程代碼 */ public class ThreadText { public static void main(String[] args) { //創(chuàng)建一個(gè)線程對(duì)象 MyThread my=new MyThread( "A線程"); //啟動(dòng)線程start() my.start(); //創(chuàng)建第二個(gè)線程對(duì)象 MyThread my1=new MyThread("B線程"); //啟動(dòng)線程start() my1.start(); } }
執(zhí)行結(jié)果圖片,截取部分結(jié)果集
2、實(shí)現(xiàn)Runnable接口(重點(diǎn))
以多個(gè)線程并發(fā),解決方法為例
**創(chuàng)建BingFa 類并實(shí)現(xiàn)Runnable **
package com.zrrd.XianCheng; /** * 多個(gè)線程并發(fā),解決方法 */ public class BingFa implements Runnable { int piaoshu=50; Object obj=new Object(); @Override public void run() { /* 同步代碼塊用synchronized修飾*/ while (true){ synchronized (obj){//發(fā)生阻塞事件 if(piaoshu>0){ System.out.println(Thread.currentThread().getName()+"剩余"+(piaoshu--)+"張"); }else{ break; } } try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+"結(jié)束售票"); } }
創(chuàng)建測(cè)試類BingFaText啟動(dòng)線程,執(zhí)行代碼塊
package com.zrrd.XianCheng; import java.lang.Thread; public class BingFaText { public static void main(String[] args) { BingFa bf=new BingFa(); Thread th1=new Thread(bf,"售票窗口1"); Thread th2=new Thread(bf,"售票窗口2"); Thread th3=new Thread(bf,"售票窗口3"); Thread th4=new Thread(bf,"售票窗口4"); th1.start(); th2.start(); th3.start(); th4.start(); } }
執(zhí)行結(jié)果圖片,截取部分結(jié)果集
3、 實(shí)現(xiàn)Callable接口(JDK1.5版本之后引入的)
創(chuàng)建MyCallable類并實(shí)現(xiàn)Callable<T>
package com.zrrd.XianCheng; import java.util.concurrent.Callable; public class MyCallable implements Callable<String> {//多線程主體類 private int ticket=5; //線程共享資源 @Override public String call() throws Exception { for (int i=0;i<100;i++){ if(this.ticket>0){ System.out.println("賣票,ticket="+this.ticket--); } } return "票已賣光!"; //返回結(jié)果 } }
創(chuàng)建測(cè)試類MyCallableDemo啟動(dòng)線程,執(zhí)行代碼塊
package com.zrrd.XianCheng; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class MyCallableDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { MyCallable callable1 = new MyCallable();//創(chuàng)建多線程實(shí)例1 MyCallable callable2 = new MyCallable();//創(chuàng)建多線程實(shí)例2 FutureTask task1 = new FutureTask<String>(callable1); FutureTask task2 = new FutureTask<String>(callable2); //FutureTask 是Runnable接口的子類,所以可以使用Thread類的構(gòu)造方法來(lái)接收task對(duì)象 new Thread(task1).start(); new Thread(task2).start(); System.out.println("A______"+task1.get()); System.out.println("B______"+task2.get()); } }
執(zhí)行結(jié)果圖片
總結(jié)
以上就是實(shí)現(xiàn)多線程的方式,在實(shí)際開(kāi)發(fā)項(xiàng)目中不建議使用第一種繼承Thread方式實(shí)現(xiàn)線程,這樣對(duì)代碼的侵入性太高,而且類與類之間單繼承,達(dá)不到代碼重用規(guī)則,建議使用第二種、或第三種。
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot啟動(dòng)時(shí)自動(dòng)執(zhí)行指定方法的幾種實(shí)現(xiàn)方式
在Spring Boot應(yīng)用程序中,要實(shí)現(xiàn)在應(yīng)用啟動(dòng)時(shí)自動(dòng)執(zhí)行某些代碼,本文主要介紹了SpringBoot啟動(dòng)時(shí)自動(dòng)執(zhí)行指定方法的幾種方式,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-03-03Java 替換字符串右側(cè)出現(xiàn)的第一個(gè)子串方式
這篇文章主要介紹了Java 替換字符串右側(cè)出現(xiàn)的第一個(gè)子串方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08基于Java回顧之網(wǎng)絡(luò)通信的應(yīng)用分析
在這篇文章里,我們主要討論如何使用Java實(shí)現(xiàn)網(wǎng)絡(luò)通信,包括TCP通信、UDP通信、多播以及NIO2013-05-05java字符串遍歷以及統(tǒng)計(jì)字符串中各類字符
這篇文章主要為大家詳細(xì)介紹了java字符串遍歷以及字符串中各類字符統(tǒng)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03springboot 如何配置多個(gè)jndi數(shù)據(jù)源
這篇文章主要介紹了springboot 如何配置多個(gè)jndi數(shù)據(jù)源的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java中的instanceof關(guān)鍵字在Android中的用法實(shí)例詳解
instanceof是Java的一個(gè)二元操作符,和==,>,<是同一類東西。接下來(lái)通過(guò)本文給大家介紹Java中的instanceof關(guān)鍵字在Android中的用法,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-07-07spring4新特性之web開(kāi)發(fā)增強(qiáng)
這篇文章主要介紹了spring4新特性之web開(kāi)發(fā)增強(qiáng)的相關(guān)資料,需要的朋友可以參考下2017-09-09SpringMVC攔截器和異常處理器使用示例超詳細(xì)講解
攔截器(Interceptor)是一種動(dòng)態(tài)攔截方法調(diào)用的機(jī)制,在SpringMVC中動(dòng)態(tài)攔截控制器方法的執(zhí)行。本文將詳細(xì)講講SpringMVC中攔截器參數(shù)及攔截器鏈配置,感興趣的可以嘗試一下2022-09-09