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");
}
}
线程数量多了之后,效率是会提高,但是不一定是成倍的提高,受到影响的因素可能很多。线程创建和销毁,也是需要时间的,线程的调度,也是需要时间的,单线程的代码编译器更好进行优化…
要执行的任务越复杂,多线程的效果就越明显。