package Java0509;
public class ThreadDemo2 {
private static long count = 100_0000_0000L;//在一個較大的整數中适當的插入一些下劃線,下劃線不具備任何意義,但是能提高代碼的可讀性。
public static void main(String[] args) {
// serial();//串行,大概時間28秒
concurrency();//并發,大概時間11秒
}
private static void concurrency() {
long beg = System.currentTimeMillis();//時間戳
Thread t1 = new Thread() {
/*匿名内部類:建立了一個沒有名字的類,隻知道這個類繼承自Thread。{}中是這個類的具體代碼,同時也會new出來一個
* 這個類的執行個體*/
@Override
public void run() {
int a = 0;
for (long i = 0; i < count; i++) {
a++;
}
}
};
Thread t2 = new Thread() {
/*匿名内部類:建立了一個沒有名字的類,隻知道這個類繼承自Thread。{}中是這個類的具體代碼,同時也會new出來一個
* 這個類的執行個體*/
@Override
public void run() {
int b = 0;
for (long i = 0; i < count; i++) {
b++;
}
}
};
t1.start();
t2.start();
try {
t1.join();//線程等待,讓主線程等待t1和t2執行結束,然後再繼續往下執行。
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
/*t1,t2和main線程之間都是并發執行的,調用了t1.start 和 t2.start之後,兩個新線程正在緊鑼密鼓的進行計算過程中,
* 此時主線程仍然會繼續執行,下面的end就随之被計算了,正确的做法應該是要保證t1和t2都計算完畢,再來計算這個end的時間戳*/
long end = System.currentTimeMillis();
System.out.println("time: " + (end - beg) + "ms");
}
private static void serial() {//串行29秒
long beg = System.currentTimeMillis();//時間戳
int a = 0;
for (long i = 0; i < count; i++) {
a++;
}
int b = 0;
for (long i = 0; i < count; i++) {
b++;
}
long end = System.currentTimeMillis();
System.out.println("time: " + (end - beg) + "ms");
}
}
線程數量多了之後,效率是會提高,但是不一定是成倍的提高,受到影響的因素可能很多。線程建立和銷毀,也是需要時間的,線程的排程,也是需要時間的,單線程的代碼編譯器更好進行優化…
要執行的任務越複雜,多線程的效果就越明顯。