您的位置:首页 > 编程语言 > Java开发

Java并发编程之线程知识一:单线程与多线程

2019-03-06 16:47 531 查看
版权声明:本文为博主原创文章,大家可以随便转载,觉得好给个赞哦。 https://blog.csdn.net/baidu_25310663/article/details/88240186

目录

1.多线程和单线程的区别和联系

2.多线程的优点

3.多线程一定快吗

1.多线程和单线程的区别和联系

 一个进程是由一或多个线程组成,进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行。

单线程
每个正在运行的程序(即进程),至少包括一个线程,这个线程叫主线程
主线程在程序启动时被创建,用于执行main函数
只有一个主线程的程序,称作单线程程序
主线程负责执行程序的所有代码。这些代码只能顺序执行,无法并发执行,容易出现代码阻塞(页面假死)。

多线程
拥有多个线程的程序,称作多线程程序。
可以根据需要开辟若干子线程。子线程和主线程都是独立的运行单元,各自的执行互不影响,因此能够并发执行,能有效地避免代码阻塞,并且提高程序的运行性能。

区别:
1.在单核CPU中,将CPU分为很小的时间片,在每一时刻只能有一个线程在执行,是一种微观上轮流占用CPU的机制。
2.多线程会存在线程上下文切换,会导致程序执行速度变慢,即采用一个拥有两个线程的进程执行所需要的时间比一个线程的进程执行两次所需要的时间要多一些。
结论:即采用多线程不会提高程序的执行速度,反而会降低速度,但是对于用户来说,可以减少用户的响应时间。
范例:一笔订单的创建,包括插入订单数据、生成订单快照、发送邮件通知卖家和记录货品销售数量等。可以使用多线程技术,将数据一致性不强的操作派发给其他线程处理(也可以使用消息队列),如生成订单快照、发送邮件等。多个线程互不影响,以空间换时间,用户在页面提交订单后所需要响应时间变短。

2.多线程的优点

  • 资源利用率更好
  • 程序设计在某些情况下更简单
  • 程序响应更快
  • 资源利用率更好

想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景。比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒。处理两个文件则需要:

[code]1| 5秒读取文件A
2| 2秒处理文件A
3| 5秒读取文件B
4| 2秒处理文件B
5| ---------------------
6| 总共需要14秒

从磁盘中读取文件的时候,大部分的CPU时间用于等待磁盘去读取数据。在这段时间里,CPU非常的空闲。它可以做一些别的事情。通过改变操作的顺序,就能够更好的使用CPU资源。看下面的顺序:

[code]1| 5秒读取文件A
2| 5秒读取文件B + 2秒处理文件A
3| 2秒处理文件B
4| ---------------------
5| 总共需要12秒

CPU等待第一个文件被读取完。然后开始读取第二个文件。当第二文件在被读取的时候,CPU会去处理第一个文件。记住,在等待磁盘读取文件的时候,CPU大部分时间是空闲的。

总的说来,CPU能够在等待IO的时候做一些其他的事情。这个不一定就是磁盘IO。它也可以是网络的IO,或者用户输入。通常情况下,网络和磁盘的IO比CPU和内存的IO慢的多。

  • 程序设计在某些情况下更简单

在单线程应用程序中,如果你想编写程序手动处理上面所提到的读取和处理的顺序,你必须记录每个文件读取和处理的状态。相反,你可以启动两个线程,每个线程处理一个文件的读取和操作。线程会在等待磁盘读取文件的过程中被阻塞。在等待的时候,其他的线程能够使用CPU去处理已经读取完的文件。其结果就是,磁盘总是在繁忙地读取不同的文件到内存中。这会带来磁盘和CPU利用率的提升。而且每个线程只需要记录一个文件,因此这种方式也很容易编程实现。

  • 程序响应更快

有时我们会编写一些较为复杂的代码(这里的复杂不是说复杂的算法,而是复杂的业务逻辑),例如,一笔订单的创建,它包括插入订单数据、生成订单赶快找、发送邮件通知卖家和记录货品销售数量等。用户从单击“订购”按钮开始,就要等待这些操作全部完成才能看到订购成功的结果。但是这么多业务操作,如何能够让其更快地完成呢?

在上面的场景中,可以使用多线程技术,即将数据一致性不强的操作派发给其他线程处理(也可以使用消息队列),如生成订单快照、发送邮件等。这样做的好处是响应用户请求的线程能够尽可能快地处理完成,缩短了响应时间,提升了用户体验。

另:针对多进程来说,多线程具有的的优势

  • ① 进程之前不能共享内存,而线程之间共享内存(堆内存)则很简单。
  • ② 系统创建进程时需要为该进程重新分配系统资源,创建线程则代价小很多,因此实现多任务并发时,多线程效率更高。
  • ③ Java语言本身内置多线程功能的支持,而不是单纯的作为底层系统的调度方式,从而简化了多线程编程。

3.多线程一定快吗

代码: 

[code]package com.hughjin.solr.util;

public class Multithreading {

private static final long COUNT = 1000000000;

public static void main(String[] args) throws InterruptedException {
serial();         //串行 单线程
concurrence();         //并行 多线程
}

private static void concurrence() throws InterruptedException {
long start = System.currentTimeMillis();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
int a = 0;
for (long i = 0; i < COUNT; i++) {
a++;
}
}
});
t.start();
int b = 0;
for (long i = 0; i < COUNT; i++) {
b--;
}
t.join();

long end = System.currentTimeMillis();
System.out.println("并行多线程执行时长:" + (end - start) + "ms");

}

private static void serial() {
long start = 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("串行单线程执行时长:" + (end - start) + "ms");
}
}

COUNT:10000

串行执行时长:0ms
并行执行时长:2ms

COUNT:1000000

串行执行时长:7ms
并行执行时长:9ms

COUNT:10000000

串行执行时长:28ms
并行执行时长:29ms

COUNT:100000000

串行执行时长:208ms
并行执行时长:102ms

COUNT:1000000000

串行执行时长:1515ms
并行执行时长:1010ms

结论:在数据量小的情况下,单线程比多线程效率高,因为线程有创建和上下文切换的开销。但是数据量达到一定的程度,多线程效率会比单线程效率高。因此,是否创建多线程处理数据,要根据实际业务情况来判断。

-------------------

链接:https://www.jianshu.com/p/cd9d0927be35

链接:http://ifeve.com/benefits

链接:https://www.cnblogs.com/feiyumo/p/9168264.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: