Java並發編程示例(一):線程的創立和履行。本站提示廣大學習愛好者:(Java並發編程示例(一):線程的創立和履行)文章只能為提供參考,不一定能成為您想要的結果。以下是Java並發編程示例(一):線程的創立和履行正文
直言不諱
在IT圈裡,每當我們議論並發時,一定會說起在一台盤算機上同時運轉的一系列線程。假如這台電腦上有多個處置器或許是一個多核處置器,那末這時候是實其實在的“同時運轉”;然則,假如盤算機只要一個單核處置器,那末這時候的“同時運轉”只是表象罷了。
一切的古代操作體系全體支撐義務的並發履行。你可以邊聽音樂,邊上彀看消息,還不延誤首發電子郵件。我們可以說,這類並發是 過程級並發 。在過程外部,我也能夠看到有許很多多的並發義務。我們把運轉在一個過程外面的並發義務稱 線程。
和並發相干的別的一個罕見概念是 並行。並發與並行之間,存在著一些分歧,也存在著一些接洽。一些法式員(Author,竊譯為“法式員”)以為,在一個單核處置器上多線程地履行運用法式就是並發,而且你可以不雅察到法式員的履行;別的,當你的法式以多線程的情勢運轉在多個處置器或許是多核處置器上時,就是並行。還有一些法式員以為假如運用法式的線程沒有依照事後設定好的次序履行就是並發;為了簡化成績處理計劃而是用個線程,而且這些線程是依照必定次序在履行,那末這是並行。
本章將經由過程十二個示例來演示若何應用Java7的API來履行一些根本的線程操作。你將可以看到,在Java法式中,若何創立、履行線程,若何掌握線程的履行,若何將一組線程作為一個單位來把持等等。
在本節,我們將進修若何在Java法式中創立線程,和若何運轉。在Java法式中,一切皆為 Object ,線程也是如斯。創立線程的方法有兩種:
1.繼續Thread類,而且重寫run()辦法;
2.創立一個類,完成Runnable接口,然後創立一個Thread類的對象,然後將完成Runnable接口的類的實例作為參數,傳遞給Thread類的實例。
在本節,我們將應用第二種方法,來創立十個線程,而且運轉起來。每一個線程盤算並打印兩個十之內的整數之積。
知其然
依據上面所述的步調來完成這裡例子:
1.創立一個名為Calculator的類,而且完成Runnable接口。代碼以下:
public class Calculator implements Runnable {
2.聲明一個公有的整形屬性,稱號為number,完成該類的結構函數來初始化方才聲明的屬性。代碼以下:
private int number;
public Calculator(int number) {
this.number = number;
}
3.完成run()辦法,該辦法是我們創立的線程履行時運轉的法式(instruction),故而該辦法用於盤算乘法表。詳細代碼以下:
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s: %d * %d = %d\n",
Thread.currentThread().getName(),
number, i, i * number);
}
}
4.如今,是時刻完成示例運用的主類(main class)了。創立名為Main的類,在該類中添加main辦法。代碼以下:
public class Main {
public static void main(String[] args) {
5.在main()辦法外部,創立一個遍歷十次的for輪回,在輪回體內,創立一個Calculator類的對象calculator,創立一個Thread類的對象thread,將calculator作為結構函數的參數,傳遞給thread的初始化語句。最初,挪用thread對象的start()辦法。代碼以下:
for (int i = 0; i < 10; i++) {
Calculator calculator = new Calculator(i);
Thread thread = new Thread(calculator);
thread.start();
}
6.運轉這個法式,看分歧線程是若何並發履行的。
知其所以然
上面是運轉法式時,掌握台打印出來的的一段輸入,我們可以看到我們創立的一切線程都在並發履行。
Thread-3: 3 * 5 = 15
Thread-0: 0 * 2 = 0
Thread-3: 3 * 6 = 18
Thread-1: 1 * 6 = 6
Thread-1: 1 * 7 = 7
Thread-3: 3 * 7 = 21
Thread-3: 3 * 8 = 24
Thread-0: 0 * 3 = 0
Thread-0: 0 * 4 = 0
Thread-3: 3 * 9 = 27
Thread-1: 1 * 8 = 8
一切的Java法式起碼履行一個線程。當我們運轉Java法式時,Java虛擬機(今後稱為JVM)會運轉一個線程,挪用含有main()辦法的法式。
當挪用Thread對象的start()辦法時,就會創立別的一個線程。挪用若干次start()辦法,就會創立若干個線程。
當一切線程履行完成後,Java法式會隨之終止。(非特別情形下,是一切非後台(non-daemon)線程履行完成)當啟動線程(例如履行main()辦法的線程)終止後,其他線程會持續履行直到完成盤算義務。當個中一個線程挪用System.exit(),要求JVM中斷法式時,一切線程中斷其履行。
挪用Thread對象的run()辦法時,不會創立線程;異樣,挪用完成Runnable接口的類run()辦法時,也不會創立線程。只要挪用Thread對象的start()辦法時,才會創立線程。
永無盡頭
正如本節開首所說,還有別的一種創立線程的辦法:繼續Thread類,重寫run()辦法,如許,便可以創立一個Thread子類的對象,然後挪用該對象的start()辦法來創立線程。
由於預備面試,找來一堆Java多線程方面的材料,個中包含這本《Java 7 Concurrency Cookbook》,講授的異常淺易易懂,異常合適對多線程懂得不多,又想賣力進修一下的同伙。找了找,沒找到中文版,爽性本身著手人給家足。所以,籌劃出一個非官方翻譯版,書名臨時定為 《Java7並發示例集》。
拿來主義
本文是從 《Java 7 Concurrency Cookbook》 (D瓜哥竊譯為 《Java7並發示例集》 )翻譯而來,僅作為進修材料應用。沒有受權,不得用於任何貿易行動。
小有所成
原書沒有完全代碼,晦氣於檢查。所以,D瓜哥加了一個末節,專門展現本節所示的完全版代碼。
Calculator類的完全代碼
package com.diguage.books.concurrencycookbook.chapter1.recipe1;
/**
* Date: 2013-09-13
* Time: 21:42
*/
public class Calculator implements Runnable {
private int number;
public Calculator(int number) {
this.number = number;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s: %d * %d = %d\n",
Thread.currentThread().getName(),
number, i, i * number);
}
}
}
Main類的完全代碼
package com.diguage.books.concurrencycookbook.chapter1.recipe1;
/**
* Date: 2013-09-13
* Time: 19:46
*/
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Calculator calculator = new Calculator(i);
Thread thread = new Thread(calculator);
thread.start();
}
}
}