关于JAVA多线程的那些东西

多线程有什么用?

  • 多核CPU
    现在的CPU动不动都是四核,八核甚至更多核,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了。
    多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。
  • 防止阻塞
    从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核CPU我们还是要应用多线程,就是为了防止阻塞。
  • 便于建模
    假设有一个大的任务A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。但是如果把这个大的任务A分解成几个小任务,任务B、任务C、任务D,分别建立程序模型,并通过多线程分别运行这几个任务,那就简单很多了

线程与进程的区别

  • 比如:我们使用打开一个微信软件,这个时候就开启了一个进程,
    当我们在微信里面进行各种操作(查看朋友圈,扫一扫…),这么多的操作就是线程。所以我们可以说“进程”是包含“线程”的“线程”是“进程”的一个子集。
    在这里插入图片描述
  • 进程有独立的地址空间,进程(线程+内存+文件/网络句柄),线程(栈+程序计数器+线程本地存储),线程才是我们操作系统所真正去运行的,而进程呢,则是像容器一样;
  • 进程之间靠什么交互呢-------通过TCP/IP的端口来实现
  • 线程靠什么进行交互呢-------前面我们提到,进程中有独立的内存空间,有一大块共享的内存,线程之间通过内存进行交互。

进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

多线程的实现

  1. 继承Thread类实现多线程
  2. 实现Runnable接口方式实现多线程
  3. 使用ExecutorService、Callable、Future实现有返回结果的多线程
  • 线程的启动 start() run() 有什么区别
    只有调用了start()方法,才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行。如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码。
  • 线程中的wait()和sleep()方法有什么区别
    sleep方法和wait方法都可以用来放弃CPU一定的时间,不同点在于如果线程持有某个对象的监视器,sleep方法不会放弃这个对象的监视器,wait方法会放弃这个对象的监视器;

线程同步

Synchronized关键字,Lock锁实现,分布式锁等

死锁

死锁就是两个线程相互等待对方释放对象锁。
思考:如何避免死锁?

多线程之间怎么进行通信

wait/notify方法

线程怎样拿到返回结果

实现Callable接口

T1、T2、T3三个线程,如何保证它们按顺序执行

join方法。

  • 怎么控制同一时间只有3个线程运行
Semaphore()

待更


猜你喜欢

转载自blog.csdn.net/weixin_44313584/article/details/110622683