进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程自己从产生、发展到最终消亡的过程。多进程操做系统能同时运行多个进程(程序),因为 CPU 具有分时机制,因此每一个进程都能循环得到本身的 CPU 时间片。因为 CPU 执行速度很是快,使得全部程序好象是在“同时”运行同样。java
线程是比进程更小的执行单位,线程是进程内部单一的一个顺序控制流。多线程
所谓多线程是指一个进程在执行过程当中能够产生多个线程,这些线程能够同时存在、同时运行,造成多条执行线索。一个进程可能包含了多个同时执行的线程。并发
多线程是实现并发机制的一种有效手段。进程和线程同样,都是实现并发的一个基本单位。线程和进程的主要差异体如今如下两个方面:ide
( 1)、一样做为基本的执行单元,线程是划分得比进程更小的执行单位。测试
( 2)、每一个进程都有一段专用的内存区域。与此相反,线程却共享内存单元(包括代码和数据),经过共享的内存单元来实现数据交换、实时通讯与必要的同步操做。spa
多线程和多进程的区别?操作系统
最本质的区别就是,每一个进程用于一整套的变量,而线程则是共享数据。并且,与进程相比较,线程更“轻量级”,建立、撤销一个线程比启动一个新进程的开销要小不少。
命令行
未使用多线程线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
class
Test {
public
static
void
main(String[] args) {
new
TestThraed().run();
for
(
int
i =
0
; i <
10
; i++) {
System.out.println(
"main方法在运行"
+i);
}
}
}
class
TestThraed {
public
void
run() {
for
(
int
i =
0
; i <
10
; i++) {
System.out.println(
"TestThread在运行"
+i);
}
}
}
|
上面这段代码是没有使用多线程的状况,程序输出结果是按顺序执行的,也就是先调用TestThread中的run方法,而后再执行main中的for循环代理
TestThread在运行0
........省略部分..........
TestThread在运行9
main方法在运行0
........省略部分..........
main方法在运行9
当使用多线程的时候
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public
class
Test {
public
static
void
main(String[] args) {
/**
* 开启一个新线程并启动它【不要直接调用run方法】
* 若是直接调用Thread.run()方法,只会执行同一线程【main线程】的任务,而不会启动新线程。
*/
new
TestThraed().start();
for
(
int
i =
0
; i <
10
; i++) {
System.out.println(
"main方法在运行"
+i);
}
}
}
class
TestThraed
extends
Thread{
@Override
public
void
run() {
for
(
int
i =
0
; i <
10
; i++) {
System.out.println(
"TestThread在运行"
+i);
}
}
}
|
使用了多线程后,程序的结果是交叉执行的。也就是在main线程中开辟了一个新的线程。因为main自己也占用一条线程,实际上在命令行中运行 java 命令时,就启动了一个 JVM 的进程,默认状况下此进程会产生两个线程:一个是 main()方法线程,另一个就是垃圾回收( GC)线程。因此这里是两条线程main线程和new TestThread().start()线程。两个线程同时交替运行着。
结果以下:
main方法在运行0
TestThread在运行0
main方法在运行1
TestThread在运行1
........省略部分..........
main方法在运行8
main方法在运行9
TestThread在运行8
TestThread在运行9
要想使某个程序是多线程运行的,能够将其变为多线程的程序。多线程程序的run方法中才是该多线程须要执行分解任务的逻辑。任意一个类都是能够变成多线程程序的。
建立线程的方式有以下两种:
1.实现Runnable接口,该接口中只有一个抽象的run方法 public abstract void run();
2.继承Thread类,其实Thread类内部也是实现了Runnable接口。只不过内部封装了对线程的一些经常使用操做。
3.1 实现Runnable接口的方式建立线程:实现Runnable接口,重写run方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//实现Runnable接口的方式来建立线程
public
class
Programmer
implements
Runnable{
@Override
public
void
run() {
for
(
int
i =
0
; i <
100
; i++) {
System.out.println(
"第"
+i+
"次"
);
}
}
}
//测试多线程
public
class
TestProgrammer {
public
static
void
main(String[] args) {
//1.建立真实角色
Programmer pro =
new
Programmer();
//2.建立代理角色+真实角色的引用
Thread proxy =
new
Thread(pro);
//3.调用start方法,启动线程
proxy.start();
for
(
int
i =
0
; i <
100
; i++) {
System.out.println(
"QQ"
);
}
}
}
|
3.2 继承Thread类方式来建立线程:继承Thread类,重写run方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//继承Thread类的方式来建立线程
public
class
Rabbit
extends
Thread {
@Override
public
void
run() {
for
(
int
i =
0
; i <
10
; i++) {
System.out.println(
"兔子跑了"
+i+
"步"
);
}
}
}
//测试多线程
public
class
TestThread {
public
static
void
main(String[] args) {
Rabbit rabbit =
new
Rabbit();
rabbit.start();
//不要调用run方法
}
}
|
警告:启动线程时,不要直接调用Thread或者Runnable接口的run方法,直接调用run方法只会执行同一个线程中的任务。而不会启动新线程。
应该调用Thread.start()方法。这个方法将建立一个执行run方法的新线程。
一、线程和进程的区别?
进程是一个程序的动态执行过程,它会在CPU给分配的一块内存中执行一段程序【一我的在一个房间里执行一个程序】
线程只是比进程更小的执行单位,它是进程内部单一的一个顺序控制流。
多线程则是把一个任务进行分解,一个程序在内存执行的时候产生多个线程,多线程共享某块数据。让多个线程来执行该一个程序【多我的在一个房间执行一个程序】
一个进程中可能包括多个线程,一个线程只能属于一个进程。
二、线程的建立方式?
继承Thread类或者实现Runnable接口
三、继承Thread类仍是实现Runnable接口?
推荐实现Runnable接口,避免单继承问题
四、线程的启动?
启动一个线程须要调用start()方法,不要直接调用run方法。run方法只会执行同一个线程中的任务而不会去开启新线程。start方法是建立一个执行run方法的新线程。