Thread和Runnable的自己的一点误区

一直以为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有关的。【最后这句话只是想当然的猜测,线程这块用的不是很多,还有些迷糊,需要加以学习使用验证】

后记:生活艰难啊
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值