辦法一
承繼于Thread類
/**
* 多線程的創(chuàng)立,辦法一:承繼于Thread類
* 1. 創(chuàng)立一個(gè)承繼于Thread類的子類
* 2. 重寫(xiě)Thread類的run() –> 將此線程履行的操作聲明在run()中
* 3. 創(chuàng)立Thread類的子類的目標(biāo)
* 4. 經(jīng)過(guò)此目標(biāo)調(diào)用start()
*
* 比如:遍歷100以內(nèi)的所有的偶數(shù)
*
* @author shkstart
* @create 2019-02-13 上午 11:46
*/ //1. 創(chuàng)立一個(gè)承繼于Thread類的子類 class MyThread extends Thread { //2. 重寫(xiě)Thread類的run() @Override public void run() { for (int i = 0; i < 100; i++) { if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + “:” + i);
}
}
} } public class ThreadTest { public static void main(String[] args) { //3. 創(chuàng)立Thread類的子類的目標(biāo) MyThread t1 = new MyThread(); //4.經(jīng)過(guò)此目標(biāo)調(diào)用start():①發(fā)動(dòng)當(dāng)時(shí)線程 ② 調(diào)用當(dāng)時(shí)線程的run() t1.start(); //問(wèn)題一:咱們不能經(jīng)過(guò)直接調(diào)用run()的辦法發(fā)動(dòng)線程。 // t1.run(); //問(wèn)題二:再發(fā)動(dòng)一個(gè)線程,遍歷100以內(nèi)的偶數(shù)。不能夠還讓現(xiàn)已start()的線程去履行。會(huì)報(bào)IllegalThreadStateException // t1.start(); //咱們需求重新創(chuàng)立一個(gè)線程的目標(biāo) MyThread t2 = new MyThread();
t2.start(); //如下操作仍然是在main線程中履行的。 for (int i = 0; i < 100; i++) { if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + “:” + i + “***********main()************”);
}
}
}
}
辦法二
完成Runnable接口
/**
* 創(chuàng)立多線程的辦法二:完成Runnable接口
* 1. 創(chuàng)立一個(gè)完成了Runnable接口的類
* 2. 完成類去完成Runnable中的籠統(tǒng)辦法:run()
* 3. 創(chuàng)立完成類的目標(biāo)
* 4. 將此目標(biāo)作為參數(shù)傳遞到Thread類的結(jié)構(gòu)器中,創(chuàng)立Thread類的目標(biāo)
* 5. 經(jīng)過(guò)Thread類的目標(biāo)調(diào)用start() * * * 比較創(chuàng)立線程的兩種辦法。
* 開(kāi)發(fā)中:優(yōu)先選擇:完成Runnable接口的辦法
* 原因:1. 完成的辦法沒(méi)有類的單承繼性的局限性
* 2. 完成的辦法更合適來(lái)處理多個(gè)線程有同享數(shù)據(jù)的狀況。
*
* 聯(lián)系:public class Thread implements Runnable
* 相同點(diǎn):兩種辦法都需求重寫(xiě)run(),將線程要履行的邏輯聲明在run()中。
*
* @author shkstart
* @create 2019-02-13 下午 4:34
*/ //1. 創(chuàng)立一個(gè)完成了Runnable接口的類 class MThread implements Runnable{ //2. 完成類去完成Runnable中的籠統(tǒng)辦法:run() @Override public void run() { for (int i = 0; i < 100; i++) { if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + “:” + i);
}
}
}
} public class ThreadTest1 { public static void main(String[] args) { //3. 創(chuàng)立完成類的目標(biāo) MThread mThread = new MThread(); //4. 將此目標(biāo)作為參數(shù)傳遞到Thread類的結(jié)構(gòu)器中,創(chuàng)立Thread類的目標(biāo) Thread t1 = new Thread(mThread);
t1.setName(“線程1”); //5. 經(jīng)過(guò)Thread類的目標(biāo)調(diào)用start():① 發(fā)動(dòng)線程 ②調(diào)用當(dāng)時(shí)線程的run()–>調(diào)用了Runnable類型的target的run() t1.start(); //再發(fā)動(dòng)一個(gè)線程,遍歷100以內(nèi)的偶數(shù) Thread t2 = new Thread(mThread);
t2.setName(“線程2”);
t2.start();
}
}
辦法一與辦法二比較推薦運(yùn)用辦法二,辦法二完成的辦法沒(méi)有類的單承繼性的局限性,完成的辦法更合適來(lái)處理多個(gè)線程有同享數(shù)據(jù)的狀況。
測(cè)驗(yàn)Thread中的常用辦法:
/**
* 測(cè)驗(yàn)Thread中的常用辦法:
* 1. start():發(fā)動(dòng)當(dāng)時(shí)線程;調(diào)用當(dāng)時(shí)線程的run()
* 2. run(): 通常需求重寫(xiě)Thread類中的此辦法,將創(chuàng)立的線程要履行的操作聲明在此辦法中
* 3. currentThread():靜態(tài)辦法,返回履行當(dāng)時(shí)代碼的線程
* 4. getName():獲取當(dāng)時(shí)線程的姓名
* 5. setName():設(shè)置當(dāng)時(shí)線程的姓名
* 6. yield():釋放當(dāng)時(shí)cpu的履行權(quán)
* 7. join():在線程a中調(diào)用線程b的join(),此時(shí)線程a就進(jìn)入阻塞狀態(tài),直到線程b完全履行完今后,線程a才
* 完畢阻塞狀態(tài)。
* 8. stop():已過(guò)期。當(dāng)履行此辦法時(shí),強(qiáng)制完畢當(dāng)時(shí)線程。
* 9. sleep(long millitime):讓當(dāng)時(shí)線程“睡覺(jué)”指定的millitime毫秒。在指定的millitime毫秒時(shí)刻內(nèi),當(dāng)時(shí)
* 線程是阻塞狀態(tài)。
* 10. isAlive():判別當(dāng)時(shí)線程是否存活
*
*
* 線程的優(yōu)先級(jí):
* 1.
* MAX_PRIORITY:10
* MIN _PRIORITY:1
* NORM_PRIORITY:5 –>默許優(yōu)先級(jí)
* 2.怎么獲取和設(shè)置當(dāng)時(shí)線程的優(yōu)先級(jí):
* getPriority():獲取線程的優(yōu)先級(jí)
* setPriority(int p):設(shè)置線程的優(yōu)先級(jí)
*
* 闡明:高優(yōu)先級(jí)的線程要搶占低優(yōu)先級(jí)線程cpu的履行權(quán)??墒莾H僅從概率上講,高優(yōu)先級(jí)的線程高概率的狀況下
* 被履行。并不意味著只有當(dāng)高優(yōu)先級(jí)的線程履行完今后,低優(yōu)先級(jí)的線程才履行。
*
*
* @author shkstart
* @create 2019-02-13 下午 2:26
*/ class HelloThread extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { if(i % 2 == 0){ // try { // sleep(10); // } catch (InterruptedException e) { // e.printStackTrace(); // } System.out.println(Thread.currentThread().getName() + “:” + Thread.currentThread().getPriority() + “:” + i);
} // if(i % 20 == 0){ // yield(); // } }
} public HelloThread(String name){ super(name);
}
} public class ThreadMethodTest { public static void main(String[] args) {
HelloThread h1 = new HelloThread(“Thread:1”); // h1.setName(“線程一”); //設(shè)置分線程的優(yōu)先級(jí) h1.setPriority(Thread.MAX_PRIORITY);
h1.start(); //給主線程命名 Thread.currentThread().setName(“主線程”);
Thread.currentThread().setPriority(Thread.MIN_PRIORITY); for (int i = 0; i < 100; i++) { if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + “:” + Thread.currentThread().getPriority() + “:” + i);
} // if(i == 20){ // try { // h1.join(); // } catch (InterruptedException e) { // e.printStackTrace(); // } // } } // System.out.println(h1.isAlive()); }
}
創(chuàng)立線程的辦法三:
完成Callable接口。 — JDK 5.0新增
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /**
* 創(chuàng)立線程的辦法三:完成Callable接口。 — JDK 5.0新增
*
*
* 怎么理解完成Callable接口的辦法創(chuàng)立多線程比完成Runnable接口創(chuàng)立多線程辦法強(qiáng)壯?
* 1. call()能夠有返回值的。
* 2. call()能夠拋出異常,被外面的操作捕獲,獲取異常的信息
* 3. Callable是支持泛型的
*
* @author shkstart
* @create 2019-02-15 下午 6:01
*/ //1.創(chuàng)立一個(gè)完成Callable的完成類 class NumThread implements Callable{ //2.完成call辦法,將此線程需求履行的操作聲明在call()中 @Override public Object call() throws Exception { int sum = 0; for (int i = 1; i <= 100; i++) { if(i % 2 == 0){
System.out.println(i);
sum += i;
}
} return sum;
}
} public class ThreadNew { public static void main(String[] args) { //3.創(chuàng)立Callable接口完成類的目標(biāo) NumThread numThread = new NumThread(); //4.將此Callable接口完成類的目標(biāo)作為傳遞到FutureTask結(jié)構(gòu)器中,創(chuàng)立FutureTask的目標(biāo) FutureTask futureTask = new FutureTask(numThread); //5.將FutureTask的目標(biāo)作為參數(shù)傳遞到Thread類的結(jié)構(gòu)器中,創(chuàng)立Thread目標(biāo),并調(diào)用start() new Thread(futureTask).start(); try { //6.獲取Callable中call辦法的返回值 //get()返回值即為FutureTask結(jié)構(gòu)器參數(shù)Callable完成類重寫(xiě)的call()的返回值。 Object sum = futureTask.get();
System.out.println(“總和為:” + sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
辦法四
運(yùn)用線程池
/**
* 創(chuàng)立線程的辦法四:運(yùn)用線程池
*
* 好處:
* 1.進(jìn)步響應(yīng)速度(減少了創(chuàng)立新線程的時(shí)刻)
* 2.降低資源消耗(重復(fù)利用線程池中線程,不需求每次都創(chuàng)立)
* 3.便于線程辦理
* corePoolSize:中心池的大小
* maximumPoolSize:最大線程數(shù)
* keepAliveTime:線程沒(méi)有使命時(shí)最多堅(jiān)持多長(zhǎng)時(shí)刻后會(huì)停止
*
*
* 面試題:創(chuàng)立多線程有幾種辦法?四種!
* @author shkstart
* @create 2019-02-15 下午 6:30
*/ class NumberThread implements Runnable{ @Override public void run() { for(int i = 0;i <= 100;i++){ if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + “: ” + i);
}
}
}
} class NumberThread1 implements Runnable{ @Override public void run() { for(int i = 0;i <= 100;i++){ if(i % 2 != 0){
System.out.println(Thread.currentThread().getName() + “: ” + i);
}
}
}
} public class ThreadPool { public static void main(String[] args) { //1. 供給指定線程數(shù)量的線程池 ExecutorService service = Executors.newFixedThreadPool(10);
ThreadPoolExecutor service1 = (ThreadPoolExecutor) service; //設(shè)置線程池的特點(diǎn) // System.out.println(service.getClass()); // service1.setCorePoolSize(15); // service1.setKeepAliveTime(); //2.履行指定的線程的操作。需求供給完成Runnable接口或Callable接口完成類的目標(biāo) service.execute(new NumberThread());//合適適用于Runnable service.execute(new NumberThread1());//合適適用于Runnable // service.submit(Callable callable);//合適運(yùn)用于Callable //3.封閉連接池 service.shutdown();
}
}
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹(shù)莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長(zhǎng)沙市天心區(qū)芙蓉中路三段398號(hào)新時(shí)空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運(yùn)營(yíng)網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)