對java多執行緒的理解
在理解多執行緒之前我們要理解程序和執行緒:
程序指每個獨立程式在計算機上的一次執行活動,例如QQ,360管家
執行緒就是一個程式內部的一條執行路徑,如果一個程式中可以同一時間執行多個執行緒,我們就說這個程式是支援多執行緒的;比如迅雷下載軟體可以同時下載多個任務。
什麼事多執行緒?
多執行緒可以理解成多工,一個程式在同一時間內執行多個任務,每個任務通常可以理解成一個執行緒,這種能執行多個執行緒的程式稱之為多執行緒程式。
為什麼需要多執行緒?
多執行緒作為一種多工併發的工作方式,具有以下特點:
提高應用程式響應
提高計算機CPU的利用率
改善程式結構。一個既長又複雜的程序可以考慮分為多個執行緒,成為幾個獨立或半獨立的執行部分,這樣的程式會利於理解和修改。
執行緒狀態:新建、可執行、阻塞、等待、中止等,如圖:
建立新執行緒的方式:
繼承Thread類 2.實現Runnable介面
宣告執行緒:
單執行緒:Thread 執行緒名 = new Thread(new 執行緒類());
多執行緒:
執行緒類 物件名A=new 執行緒類();
Thread 執行緒名1=new Thread(物件名A);
Thread 執行緒名2=new Thread(物件名A);
程式碼如下:
/**
*
* 實現Runnable介面建立執行緒
*
*/
public class FirstThread implements Runnable {
public void run() {
//要線上程中執行的程式碼
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"MyRunnable:"+i);
}
}
}
/**
* 繼承Thread建立執行緒
*/
/*public class FirstThread extends Thread(){
public void run(){
//要線上程中執行的程式碼
for(int i=0;i<100;i++){
System.out.println("MyThread:"+i);
}
}*/
public class FirstThreadTest {
/**
* 建立和啟動多個執行緒
*/
public static void main(String[] args) {
System.out.println("主執行緒開始執行。。。。");
/* 宣告執行緒1 */
Thread t1 = new Thread(new FirstThread());
/* 啟用執行緒 */
t1.start();
Thread t2 = new Thread(new FirstThread());
t2.start();
}
}
1. 執行緒睡眠:
/**
*
* 執行緒睡眠:
* 1.執行緒體中呼叫sleep()方法使當前執行緒進入睡眠狀態,呼叫sleep()方法
* 需要傳入一個毫秒數作為當前執行緒的睡眠時間,執行緒睡眠相應的時間便會甦醒,
* 重新進入可執行狀態
* 2.在實際案例開發中,為了調整各個子執行緒的執行順序,可以通過
* 執行緒睡眠的方式來完成
*
*/
public class ThreadSleep implements Runnable {
public void run() {
try {
Thread.sleep(100);//讓執行緒睡100毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
public class ThreadSleepTest {
/**
* 執行緒睡眠測試
*/
public static void main(String[] args) {
System.out.println("主執行緒執行。。。");
//宣告執行緒
Thread t1=new Thread(new ThreadSleep());
//啟用執行緒
t1.start();
Thread t2=new Thread(new ThreadSleep());
t2.start();
}
}
//問題:打印出很多重複的數字。。。
2. 執行緒讓步:
/**
*
* Thread.yield()方法會暫停當前正在執行的執行緒物件,把執行機會
* 讓給相同或更高優先順序的執行緒。
*
*/
public class ThreadYield implements Runnable {
public void run() {
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+": "+i);
if(i%10==0){//當i能被10整除時,當前執行緒讓步給其他執行緒
Thread.yield();
}
}
}
}
public class ThreadYieldTest {
/**
* 執行緒讓步測試
*/
public static void main(String[] args) {
Thread t1=new Thread(new ThreadYield());
t1.start();
Thread t2=new Thread(new ThreadYield());
t2.start();
}
}
3. 執行緒的加入:
/**
*
* 執行緒的加入:
* 有時需要執行緒間的接力來完成某項任務,這需要呼叫執行緒類jion()方法,jion()方法
* 可以使兩個交叉執行的執行緒程式設計順序執行。
* 注:A執行緒加入到B執行緒中,等A執行緒執行完了B執行緒才會拿到執行權開始執行。
* (Jion誰就是要等誰執行結束)
*
*/
public class ThreadJion implements Runnable {
public void run() {
for(int i=0;i<=20;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadJionTest {
/**
* 執行緒的加入測試類
*/
public static void main(String[] args) {
Thread t1=new Thread(new ThreadJion());
t1.start();
/*主執行緒執行for迴圈*/
for(int i=1;i<=50;i++){
System.out.println(Thread.currentThread().getName()+": "+i);
if(i==30){
try {
t1.join(); //把子執行緒加入到主執行緒執行
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}