java中多线程一定快吗?看完就知道!!!

理解上下文切换

  即使是单核处理器也支持多线程执行代码,CPU通过每个线程分配CPU时间片来实现这个机制.时间片是CPU分配给多个线程的时间,因为时间片非常短,所以CPU通过不停的切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms).

    CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务.但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务是,可以再加载这个任务状态.所以任务从保存到再加载的过程就是一次上下文切换,上下文切换会影响多线程的执行速度!!!


多线程一定快吗???

    废话不多说通过代码来说话!!!

public class ConcurrencyTest {
	
	private static final long count = 10001;
	
	public static void main(String[] args) throws  InterruptedException {
		concureency();
		serial();
	}
	
	private static void concureency() throws  InterruptedException {
		
		long start = System.currentTimeMillis();
		Thread thread = new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				int a = 0;
				for(long i = 0; i < count; i++) {
					a += 5;
				}
				
			}
		});
		thread.start();
		int b = 0;
		for(long i = 0; i < count; i++) {
			b --;
		}
		thread.join();
		long time = System.currentTimeMillis() - start;
		System.out.println("concureency :" + time+"ms,b="+b);
	}
	
	private static void serial() {
		long start = System.currentTimeMillis();
		int a = 0;
		for (long i = 0; i < count; i++) {
			a += 5;
		}
		int b = 0;
		for (long i = 0; i < count; i++) {
			b--;
		}
		long time = System.currentTimeMillis() - start;
		System.out.println("serial:" + time+"ms,b="+b+",a="+a);
	}

}

查看运行结果:

count = 10001时   
concureency :1ms,b=-10001

serial:0ms,b=-10001,a=50005

此时多线程相比下是比较慢


count = 1000000001时   
concureency :476ms,b=-1000000001
serial:712ms,b=-1000000001,a=705032709

此时多线程并发比串行快


所以答案是不一定的!!!那么为什么会是这样的呢??

        因为线程有创建和上下文切换的开销


猜你喜欢

转载自blog.csdn.net/qq_36546907/article/details/79921409