java實(shí)現(xiàn)多線(xiàn)程的兩種方式繼承Thread類(lèi)和實(shí)現(xiàn)Runnable接口的方法
實(shí)現(xiàn)方式和繼承方式有什么區(qū)別呢?
*區(qū)別:
*繼承Thread:線(xiàn)程代碼存放在Thread子類(lèi)run方法中
*實(shí)現(xiàn)Runnable:線(xiàn)程代碼存放在接口的子類(lèi)的run方法中
*實(shí)現(xiàn)方式的好處:避免了單繼承的局限性
*在定義線(xiàn)程時(shí),建議使用實(shí)現(xiàn)方式,當(dāng)然如果一個(gè)類(lèi)沒(méi)有繼承父類(lèi),那么也可以通過(guò)繼承Thread類(lèi)來(lái)實(shí)現(xiàn)多線(xiàn)程
*注意:Runnable接口沒(méi)有拋出異常,那么實(shí)現(xiàn)它的類(lèi)只能是try-catch不能throws
*Java對(duì)多線(xiàn)程的安全問(wèn)題提供了專(zhuān)業(yè)的解決方式就是同步代碼塊synchronized(對(duì)象){需要同步的代碼}
*同步的前提:
*1.有2個(gè)及以上的線(xiàn)程
*2.多個(gè)線(xiàn)程使用用一個(gè)鎖(對(duì)象)
*同步的好處:解決了多線(xiàn)程的安全問(wèn)題
*同步的弊端:多個(gè)線(xiàn)程需要判斷鎖,較為消耗資源
package 多線(xiàn)程;
class Ticket implements Runnable
{
// private static int tick = 100;
private int tick=100;
Object obj = new Object();//創(chuàng)建一個(gè)對(duì)象或者自己重新寫(xiě)一個(gè)類(lèi)來(lái)創(chuàng)建一個(gè)對(duì)象下面同步關(guān)鍵字需要用到
@Override
public void run()
{
while(true)
{
synchronized(obj)
// synchronized(this)
{
if(tick>0){
try {Thread.sleep(10);} catch (Exception e) { }
System.out.println(Thread.currentThread().getName()+"...銷(xiāo)售:"+(tick--)+"號(hào)票");
// tick--;
}else {
break;
}
}
}
}
}
public class Test
{
public static void main(String[] args)
{
Ticket t = new Ticket();//創(chuàng)建一個(gè)實(shí)現(xiàn)了Runnable接口的類(lèi)
//創(chuàng)建4個(gè)多線(xiàn)程對(duì)象并傳遞上面接口對(duì)象給其構(gòu)造方法
Thread t1 = new Thread(t);//創(chuàng)建了一個(gè)線(xiàn)程
Thread t2 = new Thread(t);//創(chuàng)建了一個(gè)線(xiàn)程
Thread t3 = new Thread(t);//創(chuàng)建了一個(gè)線(xiàn)程
Thread t4 = new Thread(t);//創(chuàng)建了一個(gè)線(xiàn)程
//開(kāi)啟線(xiàn)程
t1.start();
t2.start();
t3.start();
t4.start();
}
}
以上就是小編為大家?guī)?lái)的java實(shí)現(xiàn)多線(xiàn)程的兩種方式繼承Thread類(lèi)和實(shí)現(xiàn)Runnable接口的方法的全部?jī)?nèi)容了,希望對(duì)大家有所幫助,多多支持腳本之家~
相關(guān)文章
Java集成大模型LangChain4j實(shí)戰(zhàn)完全指南(推薦)
LangChain4j 的目標(biāo)是簡(jiǎn)化將大語(yǔ)言模型(LLM - Large Language Model)集成到Java應(yīng)用程序中的過(guò)程,本文給大家介紹Java集成大模型LangChain4j實(shí)戰(zhàn)完全指南,感興趣的朋友跟隨小編一起看看吧2025-09-09
基于Spring?Cache實(shí)現(xiàn)Caffeine+Redis二級(jí)緩存
本文主要介紹了基于Spring?Cache實(shí)現(xiàn)Caffeine+Redis二級(jí)緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Java Synchronize下的volatile關(guān)鍵字詳解
這篇文章主要介紹了Java Synchronize下的volatile關(guān)鍵字詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
springcloud整合到項(xiàng)目中無(wú)法啟動(dòng)報(bào)錯(cuò)Failed to start bean&n
這篇文章主要介紹了springcloud整合到項(xiàng)目中無(wú)法啟動(dòng)報(bào)錯(cuò)Failed to start bean 'eurekaAutoServiceRegistration'問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
如何解決java:錯(cuò)誤:無(wú)效的源發(fā)行版:16
這篇文章主要介紹了如何解決java:錯(cuò)誤: 無(wú)效的源發(fā)行版:16問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
Java中@DateTimeFormat @JsonFormat失效原因及測(cè)試填坑
本文主要介紹了Java中@DateTimeFormat @JsonFormat失效原因及測(cè)試填坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

