以前花了一个星期回顾了Java集合:java
在写文章以前通读了一遍《Java 核心技术 卷一》的并发章节和《Java并发编程实战》前面的部分,回顾了一下之前写过的笔记。从今天开始进入多线程的知识点咯~面试
以前在学习Java基础的时候学多线程基础仍是挺认真的,但是在后面一直没有回顾它,长此以往就把它给忘掉得差很少了..在学习JavaWeb上也一直没用到多线程的地方(我作的东西太水了...)。编程
因为面试这一部分是占很大比重的,而且学习多线程对我之后的提高也是颇有帮助的(自觉得)。c#
我其实也是至关于从零开始学多线程的,若是文章有错的地方还请你们多多包含,不吝在评论区下指正呢~~windows
讲到线程,又不得不提进程了~安全
进程咱们估计是很了解的了,在windows下打开任务管理器,能够发现咱们在操做系统上运行的程序都是进程:微信
进程的定义:多线程
进程是程序的一次执行,进程是一个程序及其数据在处理机上顺序执行时所发生的活动,进程是具备独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位并发
那系统有了进程这么一个概念了,进程已是能够进行资源分配和调度了,为何还要线程呢?jvm
为使程序能并发执行,系统必须进行如下的一系列操做:
能够看到进程实现多处理机环境下的进程调度,分派,切换时,都须要花费较大的时间和空间开销
引入线程主要是**为了提升系统的执行效率,减小处理机的空转时间和调度切换的时间,以及便于系统管理。**使OS具备更好的并发性
那么线程在哪呢??举个例子:
也就是说:在同一个进程内又能够执行多个任务,而这每个任务我就能够看出是一个线程。
因而咱们能够总结出:
线程有3个基本状态:
线程有5种基本操做:
线程的属性:
线程有两个基本类型:
值得注意的是:多线程的存在,不是提升程序的执行速度。其实是为了提升应用程序的使用率,程序的执行其实都是在抢CPU的资源,CPU的执行权。多个进程是在抢这个资源,而其中的某一个进程若是执行路径比较多,就会有更高的概率抢到CPU的执行权
并行:
并发:
因而可知:并行是针对进程的,并发是针对线程的。
上面说了一大堆基础,理解完的话。咱们回到Java中,看看Java是如何实现多线程的~
Java实现多线程是使用Thread这个类的,咱们来看看Thread类的顶部注释:
经过上面的顶部注释咱们就能够发现,建立多线程有两种方法:
建立一个类,继承Thread,重写run方法
public class MyThread extends Thread {
@Override
public void run() {
for (int x = 0; x < 200; x++) {
System.out.println(x);
}
}
}
复制代码
咱们调用一下测试看看:
public class MyThreadDemo {
public static void main(String[] args) {
// 建立两个线程对象
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.start();
my2.start();
}
}
复制代码
实现Runnable接口,重写run方法
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(x);
}
}
}
复制代码
咱们调用一下测试看看:
public class MyRunnableDemo {
public static void main(String[] args) {
// 建立MyRunnable类的对象
MyRunnable my = new MyRunnable();
Thread t1 = new Thread(my);
Thread t2 = new Thread(my);
t1.start();
t2.start();
}
}
复制代码
结果仍是跟上面是同样的,这里我就不贴图了~~~
不要将run()
和start()
搞混了~
run()和start()方法区别:
run()
:仅仅是封装被线程执行的代码,直接调用是普通方法start()
:首先启动了线程,而后再由jvm去调用该线程的run()方法。jvm虚拟机的启动是单线程的仍是多线程的?
那么,既然有两种方式实现多线程,咱们使用哪种???
通常咱们使用实现Runnable接口
这篇主要是讲解了线程是什么,理解线程的基础对咱们日后的学习是有帮助的。这里主要是简单的入了个门
在阅读顶部注释的时候咱们发现有”优先级“、”后台线程“这类的词,这篇是没有讲解他们是什么东西的~因此下一篇主要讲解的是Thread的API~敬请期待哦~
使用线程其实会致使咱们数据不安全,甚至程序没法运行的状况的,这些问题都会再后面讲解到的~
以前在学习操做系统的时候根据《计算机操做系统-汤小丹》这本书也作了一点点笔记,都是比较浅显的知识点。或许对你们有帮助~
参考资料:
若是文章有错的地方欢迎指正,你们互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同窗,能够关注微信公众号:Java3y。
文章的目录导航: