1什么是进程和线程:
进程是程序的一次动态执行的过程,;对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程;
线程是比进程更小的执行单位,也是最小的执行单元。线程是在进程的基础上进行的进一步划分。一个进程可以包括多个线程,一个进程至少包含一个线程;
如何调度进程和线程,完全由操作系统决定;
例如我们打开一个word,这时候就是启动了一个进程, 在编辑的时候,如果英文拼写,写错了,会有红线的提示,(也就是拼写检查),这就是一个线程,这个时候还会有打字,打印等其他线程。
我看一篇博客上,有这样一个类比,觉得挺恰当:
把计算机的核心是CPU,类比成一个供电站;
电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工;任一时刻,CPU总是运行一个进程,其他进程处于非运行状态;
进程就好比工厂的一个车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态;
线程就好比一个车间里的工人。一个进程可以包括多个线程。车间的空间是工人们共享的,这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存和资源。
2:什么叫做多任务
简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。
2-1:单核cpu如何执行多任务:
即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的。
操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。
2-2:真正的并行执行多任务只能在多核CPU上实现;
由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。
12-3:实现多任务的模式:
·
多进程模式;
多线程模式;
多进程+多线程模式
2:什么是多线程?为什么要用多线程?多线程的实现方式?
2-1什么是多线程:
多线程就是指一个进程中同时有多个执行路径(线程)正在执行。
2-2为什么要用多线程?
a.在一个程序中,有很多的操作是非常耗时的,如数据库读写操作,IO操作等,如果使用单线程,那么程序就必须等待这些操作执行完成之后才能执行其他操作。使用多线程,可以在将耗时任务放在后台继续执行的同时,同时执行其他操作。
b.可以提高程序的效率。
c.在一些等待的任务上,如用户输入,文件读取等,多线程就非常有用了。
缺点:
a.使用太多线程,是很耗系统资源,因为线程需要开辟内存。更多线程需要更多内存。
b.影响系统性能,因为操作系统需要在线程之间来回切换。
c.需要考虑线程操作对程序的影响,如线程挂起,中止等操作对程序的影响。
d.线程使用不当会发生很多问题。
2-3多线程的实现方式?
第一种:继承java.lang包种的Thread类,重写run方法(启动时需要调用start方法)
第二种:.实现Runnable接口,重写run方法,(这个时候启动线程还是还是需要调用start()方法,这个时候就需要借助Thread类的干燥方法)实现Runnable接口的实现类的实例对象作为Thread构造函数的target
第三种:通过Callable(JDK1.5追加的java.util.concurrent中的一个新接口)和FutureTask创建线程
·
4通过线程池创建线程
java.util.concurrent.ExecutorService;
3:为什么启动线程不直接调用run()方法,而是调用start()方法?
因为线程的运行需要本地操作系统的支持;
Start()方法类Thread类中的定义,start0()方法,这个方法在声明处使用了native关键字声明,native关键字表示调用本机的操作系统函数,在不同操作系统中的多线程的底层实现不同,native关键字也可以让JVM自动调整不同JVM实现。
而且只能调用一次start()方法,如果调用多次,则会抛出Illegal ThreadException 异常。
4:Java程序每次运行至少启动几个线程?
因为Java是多线程的编程语言,所以Java程序运行时也是以线程的方式运行的,主方法至少也就是一个线程;
当使用Java命令执行一个类时,实际上就会启动一个JVM,每个JVM实际上就是在操作系统中启动了一个线程,Java本身具备了垃圾回收机制,所以在Java运行时至少启动两个线程,一个是main线程,一个是垃圾收集线程。