Java多線程個(gè)人覺得需要進(jìn)行并發(fā)處理時(shí)使用吠裆,例如服務(wù)器需要同時(shí)接受多個(gè)客戶端連接养篓,且有無需實(shí)時(shí)等待的服務(wù)處理涂炎。比方說我們系統(tǒng)中短信發(fā)送任務(wù)忠聚,上萬條信息的發(fā)送我們不必等待设哗,只需第二天查看發(fā)送結(jié)果即可。
具體的使用情況可以分為如下幾類:
1两蟀、程序包含復(fù)雜的計(jì)算任務(wù)時(shí)
主要是利用多線程獲取更多的CPU時(shí)間(資源)网梢。
方法一,把一個(gè)任務(wù)分解為多個(gè)可以子任務(wù)赂毯。
因?yàn)榭傆行┳尤蝿?wù)是可以并發(fā)的战虏,多個(gè)子任務(wù)并發(fā)執(zhí)行了很可能避免CPU需要IO操作的完成,而且能夠提高系統(tǒng)的吞吐量党涕。
方法二烦感,緩存多線程的共享數(shù)據(jù)。
當(dāng)你已經(jīng)在使用多線程膛堤,很多時(shí)候必須使用共享數(shù)據(jù)手趣。如果,數(shù)據(jù)是只讀的肥荔,那么可以在第一次獲取后保存起來绿渣,以后就可以重復(fù)使用了。但是燕耿,第一次的獲取還是無法避免的需要線程同步操作的中符。
方法三,如果線程數(shù)目有限缸棵,就不要共享數(shù)據(jù)舟茶。
做法是為每一個(gè)線程實(shí)例化一個(gè)單獨(dú)的數(shù)據(jù),其實(shí)就是為每一個(gè)線程分配一塊數(shù)據(jù)使用堵第。這樣沒有線程同步操作了吧凉,速度可以盡可能的提示。
方法四踏志,如果沒辦法確定線程數(shù)目到底有多少阀捅,那么使用部分共享吧。
部分共享其實(shí)就是使用多個(gè)資源池代替一個(gè)資源池针余,資源池的數(shù)目得更加經(jīng)驗(yàn)來確定饲鄙。
2、處理速度較慢的外圍設(shè)備
比如連接多臺打印機(jī)圆雁,再比如網(wǎng)絡(luò)程序忍级,涉及數(shù)據(jù)包的收發(fā),時(shí)間因素不定伪朽。使用獨(dú)立的線程處理這些任務(wù)轴咱,可使程序無需專門等待結(jié)果。
3、程序設(shè)計(jì)自身的需要
操作系統(tǒng)是基于消息循環(huán)的搶占式多任務(wù)系統(tǒng)朴肺,為使消息循環(huán)系統(tǒng)不至于阻塞窖剑,程序需要多個(gè)線程的來共同完成某些任務(wù)。
Java多線程簡單小例子——實(shí)現(xiàn)Runnable接口:
/**
* 實(shí)現(xiàn)Runnable接口的類
*
* @author
*/
public class DoSomething implements Runnable {
private String name;
public DoSomething(String name) {
this.name = name;
}
public void run() {
for (int i = 0; i < 5; i++) {
for (long k = 0; k < 100000000; k++) ;
System.out.println(name + ": " + i);
}
}
}
/**
* 測試Runnable類實(shí)現(xiàn)的多線程程序
*
* @author
*/
public class TestRunnable {
public static void main(String[] args) {
DoSomething ds1 = new DoSomething("張三");
DoSomething ds2 = new DoSomething("李四");
Thread t1 = new Thread(ds1);
Thread t2 = new Thread(ds2);
t1.start();
t2.start();
}
}