java多線程(一)

1、Java線程       

        線程:線程是指進程內的一個執行單元,也是進程內的可調度實體. 表示程序執行的基本流程,cpu執行的基本單位java

        進程:進程是一個具備獨立功能的程序關於某個數據集合的一次運行活動api

        在一個進程中能夠包含若干個線程多線程

2、線程的生命週期(狀態)

        * java中的線程狀態:建立,就緒,運行,阻塞,死亡

        * 1.建立:在生成線程對象,並無調用該對象的start方法,這是線程處於建立窗臺併發

        * 2.就緒:當調用了線程對象的start方法後,該線程就進入了就緒狀態,但此時線程調度程序尚未把該線程設置爲當前線程,此時處於就緒狀態,在線程運行以後,從等待或者睡眠中回來後,也會處於就緒狀態框架

        * 3.運行:線程調度程序將處於就緒狀態的線程設置爲當前線程,此時線程進入了一個運行狀態,開始運行run方法體中的代碼異步

        * 4.阻塞:線程在運行的時候被暫停,一般是爲了等待某個時間某項操做的發生以後再運行,sleep、suspend、wait等方法均可以致使阻塞(線程各個api方法如何使用?sleep和wait有什麼區別?)jvm

        * 5.死亡:若是一個線程的run方法執行結束或者滴啊用stop方法後,該線程就會死亡,對於已經死亡的線程,沒法經過start進入就緒狀態!!!ide

3、線程的啓動方式:

        啓動線程的惟一方法就是經過Thread類的start()實例方法,run方法只是把線程當成一個普通方法來執行,run方法執行完後,線程就進入阻塞狀態測試

start和run 的區別:spa

         * 每一個線程都是經過某個特定Thread對象所對應的方法run來完成其操做的,方法run()稱爲線程體。

         * 經過調用Thread類的start()方法來啓動一個線程

         * 調用start方法後,線程會被放到等待隊列,等待CPU調度,並不必定立刻要開始執行,只是將這個線程置於準備狀態,而後  經過jvm,線程thread會調用run方法,執行本線程的線程體

         * start用來啓動線程,真正實現多線程運行,這是無需等待run方法體代碼執行完畢,能夠直接繼續執行下面的代碼,經過調用thread類的shart方法來啓動一個線程,此時線程是就緒狀態,並無運行,而後經過此thred類調用方法run來完成其運行操做的,這裏的run方法稱爲線程體,它包含了要執行這個線程的內容,run方法運行結束,此線程終止,而後cpu再調度其餘線程

         * run方法當作普通方法的方式調用,程序仍是要順序執行,要等待run方法執行完畢後,才能夠繼續執行下面的代碼,程序中只有一個主線程,這樣就沒有達到寫線程的目的

        先調用start後調用run,這麼麻煩,爲了避免直接調用run?就是爲了實現多線程的優勢,沒這個start不行。

 

多線程的概念:

        總結來講就是分時利用cpu,宏觀上看起來讓全部線程一塊兒執行,也叫併發。其實是cpu各個時間片處理不一樣的線程

 

Java實現多線程的方式

    1)繼承Thread類,重寫run方法,經過start啓動線程(無返回值)

   

 

    

    

     2)實現runnable接口,實現run方法,經過new Thread(Runnable target).start()方法來啓動(無返回值)

    

     3)使用ExecuterService,callback,Future實現由返回值的多線程  

      Executor框架是指java5中引入的一系列併發庫中與executor相關的功能類,包括Executor、Executors、ExecutorService、CompletionService、Future、Callable等。

 

Executor中比較重要的類和接口:

    1)Executor 接口

        Executor接口是Executor框架中最基礎的部分,定義了一個用戶執行Runnable的execute方法。沒有直接的實 現類,有一個重要的子接口ExecutorServices

    2) ExecutorService

        ExecutorService 繼承自Executor接口,定義了終止、提交任務、跟蹤任務返回結果等方法

        ExecutorService 有一個子接口ScheduledExecutorService和一個抽象實現類AbstractExecutorService

    3)Future表明異步任務的執行結果

    4) ScheduledExecutorService 能夠安排指定時間或週期性的執行任務的ExecutorService

 

多線程實現以下:

控制檯輸出結果爲線程123交替輸出

測試代碼全文以下 

package com.cm.test;

/**
 * java中的線程狀態:建立,就緒,運行,阻塞,死亡
 * 1.建立:在生成線程對象,並無調用該對象的start方法,這是線程處於建立窗臺
 * 2.就緒:當調用了線程對象的start方法後,該線程就進入了就緒狀態,但此時線程調度程序尚未把該線程設置爲噹噹前線程,此時處於就緒狀態
 * 	在線程運行以後,從等待或者睡眠中回來後,也會處於就緒狀態
 * 3.運行:線程調度程序將處於就緒狀態的線程設置爲當前線程,此時線程就進入了一個運行狀態,開始運行run方法體中的代碼
 * 4.阻塞:線程在運行的時候被暫停,一般是爲了等待某個時間的發生以後再運行,sleep,suspend,wait等方法均可以致使阻塞
 * 5.死亡:若是一個線程的run方法執行結束或者滴啊用stop方法後,該線程就會死亡,對於已經死亡的線程,沒法經過start進入就緒狀態
 * 
 * 實現線程的3中方式:
 * 1.線程1,2 實現runnable接口,重寫run方法,實例化thread和接口實現,經過start方法執行
 * 2.線程3,繼承thread類
 * 3.使用ExecutorService,callable,Future實現由返回結果的多線程(這次不詳細多說)
 * 
 * 啓動線程的惟一方法就是經過Thread類的start()實例方法,run方法只是把線程當成一個普通方法來執行,run方法執行完後,線程就進入阻塞狀態
 * 
 * 
 * start和run方法的區別:每一個線程都是經過某個特定Thread對象所對應的方法run來完成其操做的,方法run()稱爲線程體。
 * 經過調用Thread類的start()方法來啓動一個線程
 * 
 * 調用start方法後,線程會被放到等待隊列,等待CPU調度,並不必定立刻要開始執行,只是將這個線程置於準備狀態,而後經過jvm,
 * 線程thrad會調用run方法,執行本線程的線程體
 * 
 * start用來啓動線程,真正實現多線程運行,這是無需等待run方法體代碼執行完畢,能夠直接繼續執行下面的代碼,經過調用thread類的shart方法來
 * 啓動一個線程,此時線程是出於就緒狀態,並無運行,而後經過此thred類調用方法run來完成其運行操做的,這裏的run方法稱爲線程體,它包含了要執行這個線程
 * 的內容,run方法運行結束,此線程終止,而後cpu再調度其餘線程
 * run方法當作普通方法的方式調用,程序仍是要要順序執行,要等待run方法執行完畢後,才能夠繼續執行下面的代碼,程序中只有一個主線程,這樣就沒有達到寫線程的目的
 * 
 * 
 * 多線程的概念:總結來講就是分時利用cpu,宏觀上看起來讓全部線程一塊兒執行,也叫併發。其實是cpu各個時間片處理不一樣的線程
 * @author admin
 *
 */
public class MultiThread {

	public static void main(String[] args) {

		Thread thread1 = new Thread(new Runnable1());// Thread(Runnable target)
		Thread thread2 = new Thread(new Runnable2());
		Runnable3 r3 = new Runnable3();// 繼承runnable類無需再實例化thread類,實例化runnable後直接調用start方法

		thread1.start();
		thread2.start();
		r3.start();
	}

}

class Runnable1 implements Runnable {// 實現runnable接口,jdk知道是多線程

	@Override
	public void run() {
		for (int i = 0; i < 10000; i++) {
			System.out.println("進入線程runnable1運行---------");
		}

	}

}

class Runnable2 implements Runnable {

	@Override
	public void run() {

		for (int i = 0; i < 10000; i++) {
			System.out.println("進入線程runnable2運行---------");
		}
	}

}

class Runnable3 extends Thread {
	public void run() {
		for (int i = 0; i < 10000; i++) {
			System.out.println("進入線程runnable3運行--------");
		}
	}

}
相關文章
相關標籤/搜索