单线程和多线程
一、进程和线程
进程:进程是程序的一次执行过程
线程:线程是计算系统能够进行运算调度的最小单位。
一个进程可以并发多个线程,一个线程只能属于一个进程
二、单线程和多线程
单线程:只有一个线程的进程。程序执行时必须按先后顺序执行,前面的处理好,后面的才会执行。
多线程:一个进程有多个线程。程序执行时,线程会交替执行,后面的线程不用等待前面的线程处理完毕。
根据并行和并发情况:
并发时:多个线程会抢占cpu资源执行一块逻辑,没有抢到资源的进入等待状态,等有空闲cpu时,继续抢占cpu资源。
并行时:多个线程同时执行一块代码逻辑。
三、使用场景
1、串行化执行代码时,使用单线程
2、需要处理并发任务,或者需要长时间等待的任务时,使用多线程;
比如:下载时,一边下载,一遍加载进度条,需要多线程
四、上下文切换
执行串行代码时,上下文切换会增加开销,影响线程执行速度,降低运行效率。
代码示例:
// 执行次数
private static final long count = 100000l;
public static void main(String[] args) throws InterruptedException {
//并发计算
concurrency();
//单线程计算
single();
}
private static void single() {
long start = System.currentTimeMillis();
addToSum();
subbToAns();
long time = System.currentTimeMillis() - start;
System.out.println("single:" + time + "ms");
}
private static void concurrency() throws InterruptedException {
long start = System.currentTimeMillis();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
addToSum();
}
});
thread.start();
subbToAns();
thread.join();
long time = System.currentTimeMillis() - start;
System.out.println("concurrency :" + time + "ms");
}
private static void addToSum() {
int a = 0;
for (int i = 0; i < count; i++) {
a += 5;
}
}
private static void subbToAns() {
int b = Integer.MIN_VALUE;
for (int i = 0; i < count; i++) {
b--;
}
}
执行结果数据:
count = 100000l时:
concurrency :2ms
single:0ms
count = 1000000l时:
concurrency :4ms
single:2ms
count = 10000000l时:
concurrency :8ms
single:13ms
总结:多线程和单线程没有明确的快慢关系;即多线程不一定比单线程快,单线程也不一定比多线程快