Java——線程的創建,線程池

線程

多線程就是一個程序中有多個線程在同時執行。

多線程下CPU的工作原理

實際上,CPU(中央處理器)使用搶占式調度模式在多個線程間進行著高速的切換。對于CPU的一個核而言,某個時刻,只能執行一個線程,而CPU的在多個線程間切換速度相對我們的感覺要快,看上去就是在同一時刻運行。

其實,多線程程序并不能提高程序的運行速度,但能夠提高程序運行效率,CPU的使用率更高

一、創建線程

方法1:繼承Thread類,重寫run方法

public class SubThread extends Thread{public SubThread(){super("x5456");     //通過構造方法修改線程名}public void run() {for(int i=0;i<100;i++){System.out.println(super.getName()+i);}}
}

?調用:

public static void main(String[] args) {//創建剛剛繼承Thread類的子類的對象SubThread st = new SubThread();//通過setName方法,修改線程名st.setName("x54256");//調用對象的start方法,會自動執行我們重寫的run方法st.start();for(int i=0;i<100;i++) {System.out.println(Thread.currentThread().getName()+i);     //獲取當前線程的對象,調用getname()方法}
}

方法2:實現接口Runnable,重寫run方法

public class SubRunnable implements Runnable{public void run(){for(int i=0;i<100;i++){try {// 調用Thread類的sleep方法,休眠50ms,由于父接口沒有throws異常,so我們只能用try...catchThread.sleep(50);  } catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"..."+i);}}
}

調用:

public static void main(String[] args) {//創建實現Runnable接口的類的對象SubRunnable sr = new SubRunnable();//創建Thread類的對象Thread t = new Thread(sr);//啟動線程t.start();for(int i=0;i<100;i++){System.out.println(Thread.currentThread().getName()+"..."+i);}
}

方法3:使用匿名內部類,實現多線程程序

匿名內部類的前提:繼承或者接口實現

使用方法:

new 父類或者接口(){
  重寫抽象方法
}

public static void main(String[] args) {//繼承方式  XXX extends Thread{ public void run(){}}new Thread(){public void run(){System.out.println("!!!");}}.start();//實現接口方式  XXX implements Runnable{ public void run(){}}Runnable r = new Runnable(){public void run(){System.out.println("###");}};new Thread(r).start();//==================或=====================new Thread(new Runnable(){public void run(){System.out.println("@@@");}}).start();}?

實現接口的好處:

高內聚,低耦合:模塊內能做的事就自己做,模塊間的關系要盡量的小

第二種方式實現Runnable接口避免了單繼承的局限性,所以較為常用。實現Runnable接口的方式,更加的符合面向對象,線程分為兩部分,一部分線程對象,一部分線程任務。繼承Thread類,線程對象和線程任務耦合在一起。一旦創建Thread類的子類對象,既是線程對象,有又有線程任務。實現runnable接口,將線程任務單獨分離出來封裝成對象,類型就是Runnable接口類型。Runnable接口對線程對象和線程任務進行解耦。?

多線程的內存圖解:

線程的一生:?

二、線程池

線程池,其實就是一個容納多個線程的容器,其中的線程可以反復使用,省去了頻繁創建線程對象的操作,無需反復創建線程而消耗過多資源。

java中,如果每個請求到達就創建一個新線程,開銷是相當大的。在實際使用中,創建和銷毀線程花費的時間和消耗的系統資源都相當大,甚至可能要比在處理實際的用戶請求的時間和資源要多的多。除了創建和銷毀線程的開銷之外,活動的線程也需要消耗系統資源。如果在一個jvm里創建太多的線程,可能會使系統由于過度消耗內存或“切換過度”而導致系統資源不足。為了防止資源不足,需要采取一些辦法來限制任何給定時刻處理的請求數目,盡可能減少創建和銷毀線程的次數,特別是一些資源耗費比較大的線程的創建和銷毀,盡量利用已有對象來進行服務。

線程池主要用來解決線程生命周期開銷問題和資源不足問題。通過對多個任務重復使用線程,線程創建的開銷就被分攤到了多個任務上了,而且由于在請求到達時線程已經存在,所以消除了線程創建所帶來的延遲。這樣,就可以立即為請求服務,使用應用程序響應更快。另外,通過適當的調整線程中的線程數目可以防止出現資源不足的情況。

方法1:使用線程池方式--Runnable接口

public static void main(String[] args) {//調用工廠類的靜態方法,創建線程池對象(ExecutorService接口的實現類)//返回線程池對象,是返回的接口ExecutorService es = Executors.newFixedThreadPool(2);  //池內有2個線程//調用接口實現類對象es中的方法submit提交線程任務//將Runnable接口實現類對象,傳遞es.submit(new SubRunnable());es.submit(new SubRunnable());es.submit(new SubRunnable());es.submit(new SubRunnable());
}

實現的Runnable接口

public class ThreadPoolRunnable implements Runnable {public void run(){System.out.println(Thread.currentThread().getName()+" 線程提交任務");}
}

方法2:使用線程池方式Callable接口

之前的實現方法,線程運行完沒有返回值,而且不能拋異常。

Callable接口:與Runnable接口功能相似,用來指定線程的任務。其中的call()方法,用來返回線程任務執行完畢后的結果,call方法可拋出異常。

public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService es = Executors.newFixedThreadPool(2);//提交線程任務的方法submit方法返回 Future接口的實現類Future<Integer> f = es.submit(new SubCallable());//獲取返回值Integer i = f.get();System.out.println(i);
}

實現的Callable接口

public class SubCallable implements Callable<Integer>{@Overridepublic Integer call() {return 123;}
}

使用線程實現異步計算

private int a;
//通過構造方法傳參
public GetSumCallable(int a){this.a=a;
}public Integer call(){int sum = 0 ;for(int i = 1 ; i <=a ; i++){sum = sum + i ;}return sum;
}

ThreadPoolDemo.java

/** 使用多線程技術,求和* 兩個線程,1個線程計算1+100,另一個線程計算1+200的和* 多線程的異步計算*/
public class ThreadPoolDemo {public static void main(String[] args)throws Exception {ExecutorService es = Executors.newFixedThreadPool(2);Future<Integer> f1 =es.submit(new GetSumCallable(100));Future<Integer> f2 =es.submit(new GetSumCallable(200));System.out.println(f1.get());System.out.println(f2.get());es.shutdown();}
}

FutureTask的使用

FutureTask繼承了Callable和Future接口,所以它既能像callable一樣被Thread執行,也能像Future那樣獲取結果。

    @Overridepublic boolean testServiceUrl(ServiceUrlTestDTO url){// 調用地圖服務Callable<Boolean> callable = new WebServiceUtil(url.getUrl(),url.getProxy(),url.getToken());FutureTask<Boolean> futureTask = new FutureTask<>(callable);Thread thread = new Thread(futureTask);thread.start();try {Boolean isOK = futureTask.get();System.out.println("服務【"+ url.getUrl() +"】測試:"+ isOK);return isOK;} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}return false;}

  

轉載于:https://www.cnblogs.com/x54256/p/8443794.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453479.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453479.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453479.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

初級第一旬05— 藍字觀試題

準提法網絡佛學院 準提法教學平臺 一、高七師提倡初學準提法者&#xff0c;應先觀藍字&#xff0c;在《顯密圓通成佛心要集》中有依據嗎&#xff1f; 二、正修的時候&#xff0c;如果不得不中斷怎么辦&#xff1f; 三、藍字觀有幾種手印&#xff1f;可以單獨使用嗎&#xff1f;…

java并查集找朋友圈_圖—并查集(解決朋友圈問題)

圖也是一種 非線性結構&#xff0c;是由多個頂點組成的關系集合組成的一種數據結構。圖可以分為兩種&#xff0c;無向圖和有向圖。★圖的定義:★典型問題&#xff1a;利用圖能夠解決很多問題&#xff0c;這里有一個較為典型的問題&#xff0c;假如已知有n個人和m對好友關系(存于…

技術這東西,不可不看,不可全看.

最近忙著玩開心,好久沒來CSDN了,首頁上有90后程序員的消息了,稍微感慨一下,曾幾何時,自己這個80后還被70后的前輩所笑話,轉眼就成了5年經驗的老油條了.呵呵. 5年,個人認為經歷還是有些代表性的,就跟剛入行或者即將入行的哥們交個底吧,這5年到底學到了什么. 如果你看完這篇文…

rand.nextint()

自從JDK最初版本發布起&#xff0c;我們就可以使用java.util.Random類產生隨機數了。在JDK1.2中&#xff0c;Random類有了一個名為nextInt()的方法&#xff1a;public int nextInt(int n)給定一個參數n&#xff0c;nextInt(n)將返回一個大于等于0小于n的隨機數&#xff0c;即&a…

Android開發常用的插件及工具

1、GitHub,這個不管是做安卓還是其他&#xff0c;只要是開發就必上的網站&#xff0c;也是天朝沒有墻掉為數不多的網站 2、Stack OverFlow,這個和上面一樣&#xff0c;國外非常著名的問答網站&#xff0c;在上面基本上很多問題都可以得到解決 3、Genymotion模擬器&#xff0c;搞…

java poi 設置標題_poi生成Word時指定文本樣式,如“正文”,“標題1”,“標題2”等...

POI生成Word時&#xff0c;設置段落的樣式String style "2"; //標題2的樣式XWPFParagraph xwpfParagraph doc.insertNewParagraph(run);xwpfParagraph.setStyle(style);其實設置其他的樣式都一樣。例如&#xff1a;你想設置你的樣式為“標題2”(“標題2”只是你在w…

使用python做最簡單的爬蟲

使用python做最簡單的爬蟲 --之心 #第一種方法import urllib2 #將urllib2庫引用進來responseurllib2.urlopen("http://www.baidu.com") #調用庫中的方法&#xff0c;將請求回應封裝到response對象中htmlresponse.read() #調用response對象的read&#xff08;&#x…

SurfaceView介紹

SurfaceView介紹 通常情況程序的View和用戶響應都是在同一個線程中處理的&#xff0c;這也是為什么處理長時間事件&#xff08;例如訪問網絡&#xff09;需要放到另外的線程中去&#xff08;防止阻塞當前UI線程的操作和繪制&#xff09;。但是在其他線程中卻不能修改UI元素&…

產品與市場,究竟哪一個重要

上篇我們講到B2C繼B2B和C2C紅透之后&#xff0c;也正在迅速的竄紅。這一看法可不是我老邢杜撰&#xff0c;憑空想出來的&#xff0c;我們也可以從近期的主要媒體雜志上看到這個彌端。《二十一世紀報道》、《創業家》、《市場與營銷》這些經濟類雜志&#xff0c;均用大幅篇幅甚至…

enumerate()使用

enumerate()使用 如果對一個列表&#xff0c;既要遍歷索引又要遍歷元素時&#xff0c;首先可以這樣寫&#xff1a; list1 ["這", "是", "一個", "測試"] for i in range (len(list1)): print i ,list1[i] 上述方法有些累贅&#xff0…

php在window,php在window上的問題

C:/php-7/php-cgi.exe -b 127.0.0.1:9000 -c C:/php-7/php.ini用以上方式打開php的話&#xff0c;會自動的關閉&#xff0c;到處查了后說什么東西默認是500次&#xff0c;到了的話cgi就會關閉所以才想到用以下的批處理辦法去解決echo offecho Starting PHP FastCGI...set PHP_F…

(三)SpringBoot之配置文件詳解:Properties和YAML

一、配置文件的生效順序&#xff0c;會對值進行覆蓋&#xff1a; 1. TestPropertySource 注解2. 命令行參數3. Java系統屬性&#xff08;System.getProperties()&#xff09;4. 操作系統環境變量5. 只有在random.*里包含的屬性會產生一個RandomValuePropertySource6. 在打包的j…

fscanf()php,fscanf函數的用法

以前解析有規律的文件的時候要么用正則表達式&#xff0c;要么就是傻傻的自己寫程序來解析有規律的文件。今天突然發現c的庫函數中有一個現成的可以解析有規律的文件的函數&#xff0c;就是fscanf()函數。fscanf 位于頭文件中&#xff0c;函數原型為 int fscanf(FILE * stream,…

ComponentName知識

以下是ComponentName的API /*** Create a new component identifier from a Context and Class object.* * param pkg A Context for the package implementing the component, from* which the actual package name will be retrieved.* param cls The Class object of the de…

為什么設計師應該學習編寫代碼

通常&#xff0c;在完成了一件網頁設計后&#xff0c;設計師的無知都會顯露無遺而備受指責。他們把創建網頁代碼的繁重工作都留給了程序員們。這種現象不只出現在網絡開發行業&#xff0c;在軟件及游戲開發業也是如此&#xff08;完整圖文版&#xff09;。殘酷的事實就是&#…

unittest核心要素

1 TestCase 一個TestCase的實例就是一個測試用例。什么是測試用例呢&#xff1f;就是一個完整的測試流程&#xff0c; 包括測試環境的準備(setUp)&#xff0c;執行測試代碼(run)&#xff0c;以及測試后環境的還原&#xff08;tearDown&#xff09;。單元 測試&#xff08;unit …

iOS內存區域部分內容

目前參考這里&#xff1a; https://www.zhihu.com/question/263823072/answer/273452932 以后整理相關的代碼問題。 更多參考資料&#xff1a; https://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap 堆棧&#xff1a;https://baike.baidu.com/ite…

php 啟動ffmpeg,安裝php擴展 ffmpeg-php

首先先下載擴展包擴展下載地址: http://nchc.dl.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2進入 ffmpeg-php目錄 進行編譯擴展/usr/local/php/bin/phpize./configure --with-php-config/usr/local/php/bin/php-configmake 出錯報錯情況make: …

armeabi和armeabi-v7a的區別

armeabi默認選項&#xff0c; 支持基于 ARM* v5TE 的設備 支持軟浮點運算&#xff08;不支持硬件輔助的浮點計算&#xff09; 支持所有 ARM* 設備 armeabi-v7a 支持基于 ARM* v7 的設備 支持硬件 FPU 指令 支持硬件浮點運算 不同手機由于cpu的不同&#xff0c;使用不同的驅動…

淺析Numpy.genfromtxt及File I/O講解

Python 并沒有提供數組功能&#xff0c;雖然列表 (list) 可以完成基本的數組功能&#xff0c;但它并不是真正的數組&#xff0c;而且在數據量較大時&#xff0c;使用列表的速度就會慢的讓人難受。為此&#xff0c;Numpy 提供了真正的數組功能&#xff0c;以及對數據快速處理的函…