声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我QQ群:425120333
我关于多线程的学习都是通过直接在网上查找资料,查看相关视频,进行学习的,在这之前我是一点都没接触过多线程,
而唯一看到的多线程代码也是再项目中看到了别人写的多线程代码,那时想要写一个和多线程相关的代码基本是一模一样的仿照着写,
出了一点问题也搞不懂问题在哪里。 所以就一直迷迷糊糊了一段时间,后来感觉有必要把这块搞懂,就自己慢慢的找资料学习了。
废话就讲这么多,其实要学习多线程相关的,首先要搞清楚一个概念,什么是线程?线程和进程之间是什么区别?
用我的理解来讲,你写了一个类,并未这个类添加了一个main方法,你一运行这个main方法就是打开了一个新的进程(也是一个主线程,一个进程中可以包含多个线程),
如果你的代码中有关于多线程的代码,这是你运行的这个main方法就是个多线程的进程代码(感觉说的是废话),具体的更多的解释,大家可以自行百度,我讲的只是我自己的理解。
明白了线程之后,接下来有必要和大家讲一下并发和并行,我一开始对这两个是认为是一个意思的(估计和好多人和我想法是一样的)。
其实并行讲的是多个任务同时进行,如果你的电脑是单核CPU的根本做不到并行,只能是并发,并发是指多个任务都处在可运行到运行完之间,但是一个时间点
只能有一个能够运行。
大家知道CPU的执行时通过抢占时间片资源,如果是单核CPU在一个时间点上最多只能是只有一个任务能被执行,即使是写的多线程
代码那也只是提高任务被执行的可能。举个简单的例子,你有一个容器,你要往里面倒水、果汁、酒,每次倒入一种算作是一个任务,
原先是三个任务,在倒入过程中那个都有可能先倒入,但是现在把把一份水分成了十份,那任务就变成了十二个任务了。
但是对水来说先倒完水的概率并没有提升。所以对单核CPU来说,多线程并不是一定都能够提升效率,多核CPU来说,开的线程数也不是越多越快,
总之要和运行环境先关联。理清了这个基本概率,再说下多线程编程的意思:我的归纳是水往海里流。大家都知道高山上的水往河里流的过程中
除了一条主干,还会出现很多分支,当然最终都是流向大海。那个主干相当于主线程,分支相当于子线程,如果有多个分支这就使得一定量的水流
到大海的时间变得更短。也这是多线程编程的意义所在。
最后给大家贴一段代码是保证除了主线程之外的所有子线程都运行完毕的控制代码
(如果有子线程未执行完,就会一直死循环,所以需要子线程保证写的没问题,不会出现死锁的情况,慎用)。
* @introduction: 判断除主线程之外的其他线程是否运行完(如果未运行完会一直死循环)
*/
public static void runOver() {
int runThreadNum = 2;
while (runThreadNum > 1) {
runThreadNum = 0;
int total = Thread.activeCount();
Thread[] totalThread = new Thread[total];
int length = Thread.enumerate(totalThread);
for (int i = 0; i < length; i++) {
if (!totalThread[i].isDaemon()) {
runThreadNum++;
}
}
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}