一、多線程 1、1 線程與進程區別 進程:每個正在系統上運行的程式都是一個進程。每個進程包含一到多個線程。 線程:線程是一組指令的集合,或者是程式的特殊段,它可以在程式里獨立執行。 總結:進程是所有線程的集合,每一個線程是進程中的一條執行路徑。多線程的好處是可以提高程式的效率。 一個應用系統可以多個 ...
一、多線程
1、1 線程與進程區別
進程:每個正在系統上運行的程式都是一個進程。每個進程包含一到多個線程。
線程:線程是一組指令的集合,或者是程式的特殊段,它可以在程式里獨立執行。
總結:進程是所有線程的集合,每一個線程是進程中的一條執行路徑。多線程的好處是可以提高程式的效率。
一個應用系統可以多個進程:進程中一定有一個主線程(JAVA中Main函數)。線程是一個進程執行順序,流程,路徑,並且每個線程不影響。
1、2 生活中實例:
迅雷種子多個下載,買票系統,應用系統,Ajax非同步上傳。
1、3 實現多線程的方式
同步執行:單線程(同一時刻只能執行一個方法,時間相加)
非同步執行:多線程(同一時刻同時執行多個方法,不相互影響,時間隨最後執行完時間結束)
實現Runnable介面比繼承Thread類好,因為介面可以多繼承。
開始執行線程 開啟線程不是調用run方法,而是start方法
創建方法: 1、第一種繼承Thread類 重寫run方法、範例代碼:註意 開啟線程不是調用run方法,而是start方法
package com.lele.JavaAll1203Test;
/**
* @author LIULE
* @version v0.1
* @classDesc 創建多線程例子(重寫Thread的run方法)
*/
class CreateThrea extends Thread{
public void run(){
for( int i = 0;i<=200;i++){
System.out.println("i的值為"+i);
}
}
}
public class Test01Threath {
public static void main(String[]args){
System.out.println("多線程createThread開始");
CreateThrea t = new CreateThrea();
System.out.println("開始執行多線程");
t.start();
for( int i = 0;i<=200;i++){
System.out.println("MAIN"+i);
}
System.out.println("多線程createThread結束");
}
}
2、實現Runnable介面,重寫run方法,代碼範例
/**
* @author LIULE
* @version v0.1
* @classDesc 創建多線程例子(實現Runnable介面)
*/
public class Test02Runnable {
public static void main(String[]args){
System.out.println("創建一個多線程---");
creatRunnable c = new creatRunnable();
System.out.println("多線程開始調用---");
Thread thread = new Thread(c);
thread.start();
for(int i = 0 ; i <= 200 ;i++ ){
System.out.println("i的主方法的值為"+i);
}
System.out.println("多線程調用結束--");
}
}
class creatRunnable implements Runnable{
@Override
public void run(){
for(int i = 0 ; i <= 200 ;i++ ){
System.out.println("i的子線程值為"+i);
}
}
}
3、使用匿名內部類
public class Test03InNoname {
public static void main(String[]args){
System.out.println("多線程開始");
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for ( int i = 0; i < 20;i++){
System.out.println("內部子線程i"+i);
}
}
});
thread.start();
for ( int i = 0; i < 20;i++){
System.out.println("內部主線程i"+i);
}
}
}
線程常用API的方法:
start()啟動線程
currentThread()獲取當前線程對象
getID()獲取當前線程ID Thread-編號 該編號從0開始
getName()獲取當前線程名稱
sleep(long mill)休眠線程
Stop()停止線程,(不安全,已不使用)
二、守護線程
Java中有兩種線程,一種是用戶線程(非守護線程,用戶線程是指用戶自定義創建的線程,主線程停止,用戶線程不會停止)
另一種是守護線程(和主線程一起銷毀GC回收線程)。守護線程當進程不存在或主線程停止,守護線程也會被停止。
使用setDaemon(true)方法設置為守護線程
三、多線程狀態
線程從創建、運行到結束總是處於下麵五個狀態之一:新建狀態(ew Thread(r))、就緒狀態(start()方法)、運行狀態(真正開始執行run()方法)、
阻塞狀態 線程運行過程中,可能由於各種原因進入阻塞狀態:
1>線程通過調用sleep方法進入睡眠狀態;
2>線程調用一個在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會返回到它的調用者;
3>線程試圖得到一個鎖,而該鎖正被其他線程持有;
4>線程在等待某個觸發條件;
死亡狀態,需要使用isAlive方法
1) run方法正常退出而自然死亡,
2) 一個未捕獲的異常終止了run方法而使線程猝死。
四、JOIN方法
join作用是讓其他線程變為等待,
t1.join();// 讓其他線程變為等待,直到當前t1線程執行完畢,才釋放。
thread.Join把指定的線程加入到當前線程,可以將兩個交替執行的線程合併為順序執行的線程。比如線上程B中調用了線程A的Join()方法,直到線程A執行完畢後,才會繼續執行線程B。join方法寫在相應的下一個執行的方法中。