线程与进程
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,在早期面向进程设计的计算机结构中,进程是程序的基本执行实体,在当代面向线程的计算机结构中,进程是线程的容器,程序是指令数据及其组织形式的描述,进程是程序的实体。
windows中exe格式文件,就是一个程序,当运行的时候,exe指令会被加载,就会得到一个关于该exe程序的进程,状态会变成正在运行中。可以通过任务管理器,来查看进程的运行状态
线程是轻量级进程,程序执行的最小单位。进程中包括了若干个线程,举个例子:进程就是家,生活用品就是资源,一家的几个人,就是线程,可能中间会发生冲突,但大部分的时候是正常相处,其乐融融的。
线程的状态:
可在Thread.java文件中的枚举类State 中看到
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 1 1public enum State {
2 2 /**
3 3 * 线程尚未启动的线程状态--》Thread t1=new Thread()
4 4 */
5 5 NEW,
6 6
7 7 /**
8 8 * 可运行线程的线程状态。可运行线程中的线程
9 9 *状态在Java虚拟机中执行,但它可能
1010 *等待来自操作系统的其他资源
1111 *处理器等--》t1.start()
1212 */
1313 RUNNABLE,
1414
1515 /**
1616 *线程状态被阻塞,等待监视器锁。
1717 *处于阻塞状态的线程正在等待监视器锁
1818 *输入同步块/方法或
1919 *调用后重新输入同步块/方法--》在执行过程中遇到了synchronized同步块,
2020 *就会进入这个状态
2121 *直至获取到请求的锁
2222 */
2323 BLOCKED,
2424
2525 /**
2626 *等待线程的线程状态--》与TIMED_WAITING都表示等待的状态,
2727 *区别是WAITING会进入一个无时间限制的等待,
2828 *比如wait()在等待notify()方法,否则会一直等待
2929 */
3030 WAITING,
3131
3232 /**
3333 *具有指定等待时间的等待线程的线程状态。
3434 *由于调用一个线程,线程处于定时等待状态。
3535 *具有指定的正等待时间的以下方法--》线程在等待唤醒,但设置了时限
3636 */
3737 TIMED_WAITING,
3838
3939 /**
4040 *终止线程的线程状态。
4141 *线程已完成执行--》线程结束的状态
4242 */
4343 TERMINATED;
4444}
45
46
线程中start()方法与run()方法的区别:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 1 1/**
2 2 * @program: designPattern
3 3 * @description: 测试
4 4 * @author: Mr.Yang
5 5 * @create: 2018-11-17 14:35
6 6 **/
7 7public class Test {
8 8 public static void main(String[] args) {
9 9 Thread thread = new Thread();
1010 thread.start();
1111 thread.run();
1212 }
1313}
14
15
可以看到start()调用的是native–>本地方法
run()调用的是实现Runnable接口的run方法,start()与run()做的事情是不一样的。
所以如果直接调用run()方法,就相等于执行了一个普通方法而已,(本人之前对线程不太熟悉,以为两个是一样的,直至看了源码,算是我碰到的坑吧。)
默认情况情况下,Thread的run()方法什么都没有做,如果向启动线程做某事,需要实现run()方法。
另外一种实现方式
Thread的一个有参构造方法,可以传递一个Runabble接口,我们通过实现这个接口,重写Run方法,可以在线程启动的时候,做这个事情。