一直以为Thread和Runnable都可以开启新的线程,直到刚刚写一个小侧试代码,才发现自己犯的这个错误。
package com.hanji.thread;
public class AccumulationRunnable implements Runnable {
private String threadName;
private long sum;
private long lowerLimit;
private long topLimit;
public AccumulationRunnable(String threadName, long lowerLimit, long topLimit) {
this.threadName = threadName;
this.lowerLimit = lowerLimit;
this.topLimit = topLimit;
}
@Override
public void run() {
long start = System.currentTimeMillis();
for (; lowerLimit <= topLimit; lowerLimit++) {
sum += lowerLimit;
}
long time=System.currentTimeMillis()-start;
System.out.println(this.threadName+"耗时:"+time);
}
public long getAccumulation() {
return this.sum;
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
AccumulationRunnable at1 = new AccumulationRunnable("at1",1L,500000000L);
at1.run();
AccumulationRunnable at2 = new AccumulationRunnable("at2",500000001L,1000000000L);
at2.run();
AccumulationRunnable at3 = new AccumulationRunnable("at3",1000000001L,1500000000L);
at3.run();
AccumulationRunnable at4 = new AccumulationRunnable("at4",1500000001L,2000000000L);
at4.run();
AccumulationRunnable at5 = new AccumulationRunnable("at5",2000000001L,2500000000L);
at5.run();
AccumulationRunnable at6 = new AccumulationRunnable("at6",2500000001L,3000000000L);
at6.run();
AccumulationRunnable at7 = new AccumulationRunnable("at7",3000000001L,3500000000L);
at7.run();
AccumulationRunnable at8 = new AccumulationRunnable("at8",3500000001L,4000000000L);
at8.run();
long sum = at1.getAccumulation()+at2.getAccumulation()+at3.getAccumulation()+at4.getAccumulation()
+at5.getAccumulation()+at6.getAccumulation()+at7.getAccumulation()+at8.getAccumulation();
System.out.println("和为:"+sum);
long time=System.currentTimeMillis()-start;
System.out.println("main方法求和耗时:"+time);
}
}
运行多次发现求和的时间很长,而每个单独的“线程”只用了很短时间
然后想了想才发现原来Runnable只是“作业”,并不是线程。new 一个Runnable的实现类,比如
AccumulationRunnable at8 = new AccumulationRunnable("at8",3500000001L,4000000000L);
at8.run();
实际上并没有开启新的线程来运行,而只是你new了一个作业(就是一个普通的类),并业在主线程中做这个作业(就是调用一个普通类的方法,当然这个调用的执行并没在开启新线程去执行)。所以如果要用多线程,即便你用了Runnabl,也还是要用到Thread的,因为只有Thread才能开启新线程。
当然还有线程池的一些类,也都是和Thread有关的。【最后这句话只是想当然的猜测,线程这块用的不是很多,还有些迷糊,需要加以学习使用验证】
后记:生活艰难啊