简述java的线程_Java多线程的简述
線程與進程
進程:
? 是指一個內存中運行的應用程序,每個進程都有一個獨立的內存空間,一個應用程序可以同時運行多個進程;進程也是程序的一次執行過程,是系統運行程序的基本單位;系統運行一個程序即是一個進程從創建、運行到消亡的過程。
線程:
? 進程內部的一個獨立執行單元;一個進程可以同時并發地運行多個線程,可以理解為一個進程便相當于一個單 CPU 操作系統,而線程便是這個系統中運行的多個任務。
進程與線程的區別:
? 進程:有獨立的內存空間,進程中的數據存放空間(堆空間和棧空間)是獨立的,至少有一個線程。
? 線程:堆空間是共享的,棧空間是獨立的,線程消耗的資源比進程小的多。
注意:
因為一個進程中的多個線程是并發運行的,那么從微觀角度看也是有先后順序的,哪個線程執行完全取決于CPU 的調度,程序員是不能完全控制的(可以設置線程優先級)。而這也就造成的多線程的隨機性。
Java 程序的進程里面至少包含兩個線程,主線程也就是 main()方法線程,另外一個是垃圾回收機制線程。每當使用 java 命令執行一個類時,實際上都會啟動一個 JVM,每一個 JVM 實際上就是在操作系統中啟動了一個線程,java 本身具備了垃圾的收集機制,所以在 Java 運行時至少會啟動兩個線程。
由于創建一個線程的開銷比創建一個進程的開銷小的多,那么我們在開發多任務運行的時候,通常考慮創建多線程,而不是創建多進程。
多線程
多線程技術可以更好地利用系統資源。主要優勢在于充分利用了CPU的空閑時間片,用盡可能少的時間來對用戶的要求做出響應,使得進程的整體運行效率得到較大提高,同時增強了應用程序的靈活性。
? 更為重要的是,由于同一進程的所有線程共享同一內存,所以不需要特殊的數據傳送機制,不需要建立共享存儲區或共享文件,從而使得不同任務之間的協調操作與運行、數據的交互、資源的分配等問題更加易于解決。
創建多線程的五種方式
1.繼承Thread類
Thread類本質上是實現了Runnable接口的一個實例,代表一個線程的實例。
啟動線程的唯一方法就是通過Thread類的start()實例方法。
start()方法是Java的native方法,它將啟動一個新線程,并執行run()方法。
這種方法實現多線程比較簡單,通過自己創建的類直接繼承Thread,并重寫run()方法,就可以啟動新線程并執行自己定義的run()方法。
優點:代碼比較簡單
缺點:該類無法繼承其他類
1 public classThreadDemo1 {2
3 public static voidmain(String[] args) {4 ThreadDemo t1 = newThreadDemo();5 t1.setName("線程1");6 t1.start();7 ThreadDemo t2 = newThreadDemo();8 t2.setName("線程2");9 t2.start();10 }11
12 }13
14 class ThreadDemo extendsThread{15 @Override16 public voidrun() {17 for (int i = 1; i <= 10; i++) {18 System.out.println(Thread.currentThread().getName()+":"+i);19 }20 }21 }
2.實現Runnable接口
Java的繼承屬于單繼承,如果一個類繼承了其他的一個類就無法繼承Thread類。但是一個類繼承一個類的同時,可以實現多個接口。
優點:繼承其他類,統一實現該接口的實例可以共享資源。
缺點:代碼比較復雜。
1 public classThreadDemo2 {2
3 public static voidmain(String[] args) {4 MyThread myThread= newMyThread();5 Thread t1 = new Thread(myThread, "線程1");6 t1.start();7 Thread t2 = new Thread(myThread, "線程2");8 t2.start();9 }10
11 }12
13 class MyThread implementsRunnable{14 @Override15 public voidrun() {16 for (int i = 1; i <= 10; i++) {17 System.out.println(Thread.currentThread().getName()+":"+i);18 }19 }20 }
3.實現Callable接口
實現Callable接口和實現Runnable接口的方法基本相同,不過Callable接口中的call()方法有返回值,Runnable接口中的call()方法沒有返回值。
1 public classThreadDemo3 {2
3 public static void main(String[] args) throwsExecutionException, InterruptedException {4 Callable myCallable = new MyCallable();5 //使用FutureTask類包裝Callable對象,該FutureTask對象封裝了Callable對象的call()方法的返回值
6 FutureTask futureTask = new FutureTask(myCallable);7 Thread t1 = new Thread(futureTask, "線程1");8 t1.start();9 System.out.println(futureTask.get());10 }11 }12
13
14 class MyCallable implements Callable{15
16 @Override17 public Object call() throwsException {18 for (int i = 1; i <= 10; i++) {19 System.out.println(i);20 }21 return Thread.currentThread().getName()+"執行完畢";22 }23 }
4.線程池
線程池,其實就是一個容納多個線程的容器,其中的線程可以重復使用,省去了頻繁創建線程對象的操作,避免了頻繁創建線程的資源消耗。
Executor類:提供了一系列工廠方法用于創建線程池,返回的線程池都實現了ExecutorService接口。
Java通過Executors提供四種線程池,分別為:
newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
newFixedThreadPool 創建一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。
newScheduledThreadPool 創建一個定長線程池,支持定時及周期性任務執行。
newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。
ExecutorService提供了sumbit()方法,傳遞一個Callable或Runnable,將線程放進線程池中,并執行。
優點:實現自動化裝配,易于管理,循環利用資源。
1 public classThreadDemo4 {2
3 public static voidmain(String[] args) {4 ExecutorService pool = Executors.newFixedThreadPool(2);5 //將線程放入線程池中并執行
6 Future> submit = pool.submit(newMyRunnableThread());7 pool.submit(newMyRunnableThread());8 //關閉線程池
9 pool.shutdown();10 }11
12 }13
14 class MyRunnableThread implementsRunnable {15 @Override16 public voidrun() {17 for (int i = 1; i <=10 ; i++) {18 System.out.println(Thread.currentThread().getName()+":"+i);19 }20 }21 }
5.Timer類和TimerTask類
在這種實現方式中,Timer類實現的是類似定時任務的功能,也就是定時或者每隔一定時間觸發一次線程。
Timer類本身實現的就是一個線程,只是這個線程是用來調用其他線程。
TimerTask類實現了Runnable接口,具備了多線程的能力。
在這種實現方式中,通過繼承TimerTask使該類獲得多線程的能力,重寫run()方法,然后通過Timer類啟動線程。
在實際使用時,一個Timer可以啟動任意多個TimerTask實現的線程,但是多個線程之間會存在阻塞。所以如果多個線程之間如果需要完全獨立運行的話,
最好還是一個Timer啟動一個TimerTask實現。
1 public classThreadDemo5 {2
3 public static voidmain(String[] args) {4 Timer timer = newTimer();5 MyTimerTask myTimerTask1 = new MyTimerTask("線程1");6 MyTimerTask myTimerTask2 = new MyTimerTask("線程2");7 //啟動線程
8 timer.schedule(myTimerTask1,0);9 timer.schedule(myTimerTask2,0);10 }11
12 }13
14 class MyTimerTask extendsTimerTask{15 privateString TimerTaskName;16
17 publicMyTimerTask(String TimerTaskName) {18 this.TimerTaskName=TimerTaskName;19 }20
21 @Override22 public voidrun() {23 for (int i = 1; i <=10 ; i++) {24 System.out.println(TimerTaskName+":"+i);25 }26 }27 }
總結
以上是生活随笔為你收集整理的简述java的线程_Java多线程的简述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 本周油价又要涨了!国际油价此轮上涨已经涨
- 下一篇: java美元兑换,(Java实现) 美元