1铝条、Web庫類、Sevlet天生有多線程性席噩。
2班缰、定義任務(wù):使用Runnable接口并實(shí)現(xiàn)run()方法。? ?而將runnable (不返回任何值) 對(duì)象編程工作任務(wù)的方式為
Thread t = new Thread(new Task());
t.start();
這里start()會(huì)迅速返回悼枢,因?yàn)槊總€(gè)任務(wù)都由不同的線程執(zhí)行埠忘,不影響main()中的其他任務(wù)操作。
如果想要添加更多的線程馒索,就可以使用for循環(huán)來進(jìn)行操作:
for(int i=0; i<5; i++)
? ? new Thread(new Task()).start();
也可使用線程池來存儲(chǔ)線程
ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0; i<5; i++)
? ? exec.execute(new Task());
exec.shutdown();
newCachedThreadPool可以使用其他Executor代替莹妒,比如固定線程個(gè)數(shù)的newFixedThreadPool,還有接受線程數(shù)量為1的SingleThreadExecutor (特殊的newFixedThreadPool)绰上,其會(huì)序列化所有提交的任務(wù)并維護(hù)它自己的懸掛任務(wù)隊(duì)列旨怠。
當(dāng)有大量線程并且運(yùn)行的任務(wù)為使用文件系統(tǒng)時(shí),可以使用SingleThreadExecutor 以保證任何線程中都只有唯一的任務(wù)運(yùn)行蜈块。
3鉴腻、如果需要線程有返回值,則使用Callable接口百揭,帶有call函數(shù)并且使用exec.submit()來調(diào)用爽哎,而submit方法會(huì)產(chǎn)生Future對(duì)象 (使用Callable返回結(jié)果的特定類型并進(jìn)行參數(shù)化),然后使用Future.get函數(shù)來獲取結(jié)果信峻。
4倦青、可以使用sleep()來控制任務(wù)之間的順序運(yùn)行,可以跑出InterruptedException異常盹舞。但因?yàn)轫樞蛐袨橐蕾囉诘讓拥木€程機(jī)制产镐,在不同的操作系統(tǒng)之間有差異。所以控制任務(wù)執(zhí)行踢步,最好使用同步控制癣亚,或者編寫協(xié)作例程。
5获印、調(diào)用Thread.setDaemon可以將線程設(shè)置為后臺(tái)線程述雾,從而保證在非后臺(tái)線程結(jié)束時(shí)程序終止并殺死所有后臺(tái)線程。