java 线程的基本概念_Java多线程——多线程的基本概念和使用
一、進(jìn)程和線程的基礎(chǔ)知識
1、進(jìn)程和線程的概念
進(jìn)程:運(yùn)行中的應(yīng)用程序稱為進(jìn)程,擁有系統(tǒng)資源(cpu、內(nèi)存)
線程:進(jìn)程中的一段代碼,一個(gè)進(jìn)程中可以有多段代碼。本身不擁有資源(共享所在進(jìn)程的資源)
在java中,程序入口被自動創(chuàng)建為主線程,在主線程中可以創(chuàng)建多個(gè)子線程。
區(qū)別:
1、是否占有資源問題
2、創(chuàng)建或撤銷一個(gè)進(jìn)程所需要的開銷比創(chuàng)建或撤銷一個(gè)線程所需要的開銷大。
3、進(jìn)程為重量級組件,線程為輕量級組件
多進(jìn)程:?在操作系統(tǒng)中能同時(shí)運(yùn)行多個(gè)任務(wù)(程序)
多線程:?在同一應(yīng)用程序中有多個(gè)功能流同時(shí)執(zhí)行
2、線程的主要特點(diǎn)
①、不能以一個(gè)文件名的方式獨(dú)立存在在磁盤中;
②、不能單獨(dú)執(zhí)行,只有在進(jìn)程啟動后才可啟動;
③、線程可以共享進(jìn)程相同的內(nèi)存(代碼與數(shù)據(jù))。
3、線程的主要用途
①、利用它可以完成重復(fù)性的工作(如實(shí)現(xiàn)動畫、聲音等的播放)。
②、從事一次性較費(fèi)時(shí)的初始化工作(如網(wǎng)絡(luò)連接、聲音數(shù)據(jù)文件的加載)。
③、并發(fā)執(zhí)行的運(yùn)行效果(一個(gè)進(jìn)程多個(gè)線程)以實(shí)現(xiàn)更復(fù)雜的功能
4、多線程(多個(gè)線程同時(shí)運(yùn)行)程序的主要優(yōu)點(diǎn)
①、可以減輕系統(tǒng)性能方面的瓶頸,因?yàn)榭梢圆⑿胁僮?#xff1b;
②、提高CPU的處理器的效率,在多線程中,通過優(yōu)先級管理,可以使重要的程序優(yōu)先操作,提高了任務(wù)管理的靈活性;另一方面,在多CPU系統(tǒng)中,可以把不同的線程在不同的CPU中執(zhí)行,真正做到同時(shí)處理多任務(wù)。
二、線程的創(chuàng)建和啟動
其實(shí)看看API,從Thread的構(gòu)造方法,就可以看出創(chuàng)建一個(gè)線程的方式:
Thread對象。
Thread對象。
Thread對象。
Thread對象。
Thread對象。
Thread對象,以便將target作為其運(yùn)行對象,將指定的name作為其名稱,并作為group所引用的線程組的一員。
ThreadGroup?group,Runnable?target,String?name, long?stackSize)
分配新的Thread對象,以便將target作為其運(yùn)行對象,將指定的name作為其名稱,作為group所引用的線程組的一員,并具有指定的堆棧大小。
Thread對象。
后面4個(gè)構(gòu)造方法創(chuàng)建一個(gè)線程并加入到一個(gè)線程組中,但是創(chuàng)建線程的方式和前面的相似。
java中創(chuàng)建一個(gè)線程有兩種方式:
1、繼承Thread類,重寫run()方法,然后直接new這個(gè)對象的實(shí)例,創(chuàng)建一個(gè)線程的實(shí)例。然后調(diào)用start()方法啟動線程
2、實(shí)現(xiàn)Runnable接口,重寫run()方法,然后調(diào)用new Thread(runnable)的方式創(chuàng)建一個(gè)線程,然后調(diào)用start()方法啟動線程
其實(shí)看Thread的源文件,發(fā)現(xiàn)它也是實(shí)現(xiàn)了Runnable接口的。
public?class?Thread?implements?Runnable
1、繼承Thread類的方式
public?class?Test1?{
public?static?void?main(String[]?args)?{
System.out.println(Thread.currentThread().getName());
MyThread?myThread=new?MyThread();
myThread.start();
}
}
class?MyThread?extends?Thread{
int?i=0;
@Override
public?void?run()?{
while?(i<10)?{
System.out.println(this.getName()+"????i的值???"+i);
i++;
}
}
}
2、實(shí)現(xiàn)Runnable接口
public?class?Test1?{
public?static?void?main(String[]?args)?{
System.out.println(Thread.currentThread().getName());
Thread?thread=new?Thread(new?MyRunnable());
thread.start();
}
}
class?MyRunnable?implements?Runnable{
int?i=0;
@Override
public?void?run()?{
while?(i<10)?{
System.out.println(Thread.currentThread().getName()+"????i的值???"+i);
i++;
}
}
}
注意:
①、在繼承Thread的方式中,可以使用getName()方法,來獲得當(dāng)前線程的名字,這是因?yàn)樵赥hread類中,有這個(gè)方法。可是在實(shí)現(xiàn)Runnable方式中,卻不可以使用this.getName(),因?yàn)镽unnable接口沒有這個(gè)方法(可以看出來,因?yàn)槲覀儧]有提示我們需要重寫這個(gè)方法),所以只能通過Thread的靜態(tài)方法Thread.currentThread()取得當(dāng)前的Thread對象,在調(diào)用getName()方法,來取得當(dāng)前線程的名字。
②、對Java來說,run()方法沒有任何特別之處。像main()方法一樣,它只是新線程知道調(diào)用的方法名稱(和簽名)。因此,在Runnable上或者Thread上調(diào)用run方法是合法的。但并不啟動新的線程。只有調(diào)用start()方法才會啟動新線程。
3、兩種方式的對比
采用實(shí)現(xiàn)Runnable接口方式的多線程具有優(yōu)勢,一般都會使用這種方式:
1、線程類只是實(shí)現(xiàn)了Runnable接口,還可以繼承其他類。
2、在這種方式下,可以多個(gè)線程共享一個(gè)Runnable target對象,所以非常適合多個(gè)相同線程來處理同一份資源的情況,從而可以將CPU、代碼和數(shù)據(jù)分開,形成清晰的模型,較好的體現(xiàn)了面向?qū)ο蟮乃枷搿?/p>
總結(jié)
以上是生活随笔為你收集整理的java 线程的基本概念_Java多线程——多线程的基本概念和使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java怎么做沙子合并_dp之沙子合并
- 下一篇: java 重载 返回_java – 返