今天就跟大家聊聊有關(guān)Java中線(xiàn)程的實(shí)現(xiàn)方式有哪些,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)專(zhuān)業(yè)為企業(yè)提供高平網(wǎng)站建設(shè)、高平做網(wǎng)站、高平網(wǎng)站設(shè)計(jì)、高平網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、高平企業(yè)網(wǎng)站模板建站服務(wù),十多年高平做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
線(xiàn)程是進(jìn)程的一個(gè)實(shí)體,是 CPU 調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。線(xiàn)程 自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是 它可與同屬一個(gè)進(jìn)程的其他的線(xiàn)程共享進(jìn)程所擁有的全部資源。
多線(xiàn)程指在單個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線(xiàn)程執(zhí)行不同的任務(wù)。
多線(xiàn)程編程的目的,就是“最大限度地利用 cpu 資源”,當(dāng)某一線(xiàn)程的處理不需要占用 cpu 而只和 io 等資源 打交道時(shí),讓需要占用 Cpu 的其他線(xiàn)程有其他機(jī)會(huì)獲得 cpu 資源。從根本上說(shuō),這就是多線(xiàn)程編程的最終 目的。
Thread
Runnable
Callable
繼承Thread類(lèi)并重寫(xiě)run方法。其實(shí)Thread是實(shí)現(xiàn)Runnable接口來(lái)實(shí)現(xiàn)線(xiàn)程, class Thread implements Runnable {
。
public class Test {
public static void main(String[] args) {
Thread01 thread01 = new Thread01();
thread01.start();
}
}
class Thread01 extends Thread {
@Override
public void run() {
System.out.println("線(xiàn)程01執(zhí)行了。。。");
}
}
實(shí)現(xiàn)Runnable并實(shí)現(xiàn)run方法,將Runnable放入到Thread中start即可。
public class Test {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable01());
thread.start();
}
}
class Runnable01 implements Runnable{
public void run() {
System.out.println("Runnable01 running....");
}
}
第一種方法通過(guò)覆蓋Thread中的run方法來(lái)實(shí)現(xiàn)線(xiàn)程,第二種方法中,通過(guò)源碼可以發(fā)現(xiàn),Thread中run方法的代碼為:
public void run() {
if (target != null) {
target.run();
}
}
傳入的Runnable就是target,所以當(dāng)我們執(zhí)行 Thread.start()
的時(shí)候,其實(shí)是執(zhí)行的Runnable的run方法。
實(shí)現(xiàn)Callable重寫(xiě)call方法,實(shí)現(xiàn)Callable和實(shí)現(xiàn)Runnable類(lèi)似,但是功能更強(qiáng)大,具體表現(xiàn)在:
可以在任務(wù)結(jié)束后提供一個(gè)返回值,Runnable不行
call方法可以?huà)伋霎惓?,Runnable的run方法不行
可以通過(guò)運(yùn)行Callable得到的Fulture對(duì)象監(jiān)聽(tīng)目標(biāo)線(xiàn)程調(diào)用call方法的結(jié)果,得到返回值,(fulture.get(),調(diào)用后會(huì)阻塞,直到獲取到返回值)
public class Test {
public static void main(String[] args) throws Exception {
System.out.println("main的線(xiàn)程:" + Thread.currentThread().getName());
Callable01 callable01 = new Callable01();
FutureTask ft = new FutureTask(callable01);
Thread thread = new Thread(ft);
thread.start();
System.out.println(ft.get()); //獲得線(xiàn)程執(zhí)行返回結(jié)果
}
}
class Callable01 implements Callable {
public Integer call() throws Exception {
System.out.println("Callable01的線(xiàn)程:" + Thread.currentThread().getName());
return 111;
}
}
將Fulture放入Thread,能想到Fulture應(yīng)該也實(shí)現(xiàn)了Runnable接口:
看完上述內(nèi)容,你們對(duì)Java中線(xiàn)程的實(shí)現(xiàn)方式有哪些有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。