您好,登錄后才能下訂單哦!
.一、概述:
從c開始,任何一門語言的默認執行順序都是按照一條路走到黑的方式。
但是,當我們需要同時進行多項任務的時候該怎么辦呢?這時我們可以將一個任務拆分成多個小任務同時處理(深層一點講,就是雖然我單線程也能夠做的到,但是cpu沒有最高效率的利用,時間也沒有高效的利用)。
所以:多線程解決的是并發的問題,目的是使任務執行效率更高,實現前提是“阻塞”。它們看上去時同時在執行的,但實際上只是分時間片試用cpu而已。
二、java任務:
作為一只Red_Ant,我才不關心Black_Ant搬過來的食物建筑的巢穴是怎么來的,因此java底層的多線程機制是如何執行的,這里就交給Black_Ant了。
java任務就是:實現Runnable接口類定義一個類。
那就簡單了,就是說平常寫的功能、方法、變量只要實現Runnable接口,把該任務實現的代碼寫到run方法中或者run方法調用就OK了。
舉例:
package com.css.java.learning.action;
public class Task1 implements Runnable {
protected int countDown = 10;
public Task1(int countDown){
this.countDown = countDown;
}
public String mhtao(){
return "論10斤,紅心獼猴桃可以吃幾天?";
}
@Override
public void run() {
while(countDown-->0){
System.err.println(mhtao());
/**
* Java線程中的Thread.yield( )方法,譯為線程讓步,它能讓當前線程由“運行狀態”進入到“就緒狀態”。
* 顧名思義,就是說當一個線程使用了這個方法之后,它就會把自己CPU執行的時間讓掉。
* 然后,自己和其他線程一樣。依據cup的執行概率來執行自己或其他線程
* 用Red_Ant的話來講就是:大家依次排隊擠公交,輪到這貨了。
* 這貨沒有上車,而是講了一句話:“大家一塊兒擠啊,誰上去算誰的座位”。
* 于是輪流事件就變成了概率事件,個子大,有力氣的可能概率大一點,后面的也有概率,不過小一點。
*/
Thread.yield();
}
}
}
定義了任務,此時并不涉及多線程,所以,任務本身就是一個類,它的對象我們可以在任意地方調用。
三、java線程:
java的線程是用來驅動任務執行的,也就是說你得把任務掛載到一個線程上,這樣該線程才能驅動你定義的任務來執行。
①定義:
線程Thread自身并不執行任何操作,它只是用來被多線程機制調用,并驅動賦予它的任務。
聲明線程并將任務附著到該線程上:
Thread t = new Thread(new Task1(5));
這樣,任務就附著給了線程,下面就是讓線程啟動,只需要如下的調用:
t.start();
至此,線程聲明ok。
②舉例:
package com.css.java.learning.action;
public class Thread1 {
public static void main(String[] args) {
Thread t = new Thread(new Task1(5));
t.start();
System.err.println("線程任務已被java調用!");
}
}
可以看出,java調用線程之后。立馬返回到了主程序上,然后再利用java的多線程機制,進行任務執行。
為了更深入的看清,java線程的本質。
我這里在定義一個任務,掛到線程上去。
package com.css.java.learning.action;
public class Task2 implements Runnable {
protected int countDown = 10;
public String mhtao(){
return "答:可以吃3天!";
}
@Override
public void run() {
while(countDown-->0){
System.err.println(mhtao());
Thread.yield();
}
}
}
線程調用:
package com.css.java.learning.action;
public class Thread1 {
public static void main(String[] args) {
Thread t = new Thread(new Task1(5));
t.start();
Thread t2 = new Thread(new Task2());
t2.start();
System.err.println("線程任務已被java調用!");
}
}
隨機性
運行結果一:
運行結果二:
好了,運行結果都在這了。筆者就不多說了。
四、java多線程管家:
這里,筆者科普一下Executor線程池框架!
我們通過上述方法,創建的線程。雖然稱之為線程,但他是沒人管的野線程。
調用new Thread()創建的線程缺乏管理,而且可以無限制創建,之間相互競爭,會導致過多占用系統資源導致系統癱瘓。 不利于擴展,比如如定時執行、定期執行、線程中斷。
我們,得找東西管管它啊。Executor線程管家來嘍。
重用存在的線程,減少對象創建、消亡的開銷,性能佳
可有效控制最大并發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞
提供定時執行、定期執行、單線程、并發數控制等功能。
其內部使用了線程池機制,它在java.util.cocurrent 包下,通過該框架來控制線程的啟動、執行和關閉,可以簡化并發編程的操作。因此,在Java 5之后,通過Executor來啟動線程比使用Thread的start方法更好,除了更易管理,效率更好(用線程池實現,節約開銷)外,還有關鍵的一點:有助于避免this逃逸問題——如果我們在構造器中啟動一個線程,因為另一個任務可能會在構造器結束之前開始執行,此時可能會訪問到初始化了一半的對象用Executor在構造器中。
Executor框架包括:線程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。
我們將在下一篇文章,講述java多線程管家:Executor!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。