Java線程基本使用之如何實(shí)現(xiàn)Runnable接口
1. 實(shí)現(xiàn) Runnable 接口
說(shuō)明
- java是單繼承的,在某些情況下一個(gè)類(lèi)可能已經(jīng)繼承了某個(gè)父類(lèi),這時(shí)在用繼承Thread類(lèi)方法來(lái)創(chuàng)建線程顯然不可能了。
- java設(shè)計(jì)者們提供了另外一個(gè)方式創(chuàng)建線程,就是通過(guò)實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建線程
應(yīng)用案例
- 請(qǐng)編寫(xiě)程序,該程序可以每隔
1
秒。在控制臺(tái)輸出“你好,兮動(dòng)人”,當(dāng)輸出10
次后,自動(dòng)退出。 - 使用實(shí)現(xiàn)
Runnable
接口的方式實(shí)現(xiàn)。
public class Thread02 { public static void main(String[] args) { Dog dog = new Dog(); //dog.start(); //這里不能調(diào)用 start 方法 //創(chuàng)建了 Thread 對(duì)象,把 dog 對(duì)象(實(shí)現(xiàn)了 Runnable ),放入了 Thread Thread thread = new Thread(dog); thread.start(); } } class Dog implements Runnable { //通過(guò)實(shí)現(xiàn)Runnable接口來(lái)實(shí)現(xiàn) int count = 0; @Override public void run() { //普通方法 while (true) { System.out.println("你好,兮動(dòng)人-" + (++count) + Thread.currentThread().getName()); //休眠1秒 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if (count == 10) { break; } } } }
這里底層使用了設(shè)計(jì)模式【代理模式】=> 代碼模擬實(shí)現(xiàn)Runnable
接口 開(kāi)發(fā)線程的機(jī)制。
public class Thread02 { public static void main(String[] args) { Tiger tiger = new Tiger(); ThreadProxy threadProxy = new ThreadProxy(tiger); threadProxy.start(); } } class Animal {} class Tiger extends Animal implements Runnable { @Override public void run() { System.out.println("老虎..."); } } //線程代理類(lèi),模擬了一個(gè)極簡(jiǎn)的Thread類(lèi) class ThreadProxy implements Runnable { //可以把 Proxy 類(lèi)當(dāng)做 Thread private Runnable target = null; // 屬性類(lèi)型 是 Runnable @Override public void run() { if (target != null) { target.run();//動(dòng)態(tài)綁定(運(yùn)行類(lèi)型是Tiger) } } public ThreadProxy(Runnable target) { this.target = target; } public void start() { start0();//這個(gè)方法是真正實(shí)現(xiàn)多線程的方法 } public void start0() { run(); } }
2. 線程使用應(yīng)用案例–多線程執(zhí)行
請(qǐng)編寫(xiě)一個(gè)程序,創(chuàng)建兩個(gè)線程,一個(gè)線程每隔1
秒輸出“hello,world
”,輸出10
次,退出,另一個(gè)線程每隔1
秒輸出“hi
”,輸出5
次退出。
public class Thread03 { public static void main(String[] args) { T1 t1 = new T1(); T2 t2 = new T2(); Thread thread1 = new Thread(t1); thread1.start(); Thread thread2 = new Thread(t2); thread2.start(); } } class T1 implements Runnable { int count = 0; @Override public void run() { while (true) { System.out.println("hello world" + (++count)); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if (count == 10) { break; } } } } class T2 implements Runnable { int count = 0; @Override public void run() { while (true) { System.out.println("hi" + (++count)); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if (count == 5) { break; } } } }
3. 如何理解線程
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis plus 開(kāi)啟sql日志打印的方法小結(jié)
Mybatis-Plus(簡(jiǎn)稱(chēng)MP)是一個(gè) Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生。本文重點(diǎn)給大家介紹mybatis plus 開(kāi)啟sql日志打印的方法小結(jié),感興趣的朋友一起看看吧2021-09-09java中對(duì)象和JSON格式的轉(zhuǎn)換方法代碼
JSON格式可以輕松地以面向?qū)ο蟮姆绞睫D(zhuǎn)換為Java對(duì)象,下面這篇文章主要給大家介紹了關(guān)于java中對(duì)象和JSON格式的轉(zhuǎn)換方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12圖文精講java常見(jiàn)分布式事務(wù)理論與解決方案
對(duì)于分布式系統(tǒng),最簡(jiǎn)單的理解就是一堆機(jī)器對(duì)外提供服務(wù),相比單體服務(wù),它可以承受更高的負(fù)載,但是分布式系統(tǒng)也帶了一系列問(wèn)題,今天帶大家搞懂和分布式相關(guān)的常見(jiàn)理論和解決方案2021-11-11Java兩種方式實(shí)現(xiàn)動(dòng)態(tài)代理
Java 在 java.lang.reflect 包中有自己的代理支持,該類(lèi)(Proxy.java)用于動(dòng)態(tài)生成代理類(lèi),只需傳入目標(biāo)接口、目標(biāo)接口的類(lèi)加載器以及 InvocationHandler 便可為目標(biāo)接口生成代理類(lèi)及代理對(duì)象。我們稱(chēng)這個(gè)Java技術(shù)為:動(dòng)態(tài)代理2020-10-10JsonProperty及JSONField注解的使用說(shuō)明
文章介紹了兩個(gè)常用的Java庫(kù)注解:Jackson的@JsonProperty和Fastjson的@JSONField,它們用于控制Java對(duì)象與JSON數(shù)據(jù)之間的序列化和反序列化,文章詳細(xì)說(shuō)明了這兩個(gè)注解的常見(jiàn)屬性及其使用場(chǎng)景,包括指定屬性名、控制字段可見(jiàn)性、設(shè)置默認(rèn)值和標(biāo)記字段的必需性2024-12-12Spring實(shí)現(xiàn)默認(rèn)標(biāo)簽解析流程
這篇文章主要為大家詳細(xì)介紹了Spring實(shí)現(xiàn)默認(rèn)標(biāo)簽解析流程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01布隆過(guò)濾器的原理以及java 簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了布隆過(guò)濾器的原理以及java 簡(jiǎn)單實(shí)現(xiàn),幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下2020-11-11