日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

简述java的线程_Java多线程的简述

發布時間:2023/12/10 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简述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多线程的简述的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。