并行:两个或者多个事件在同一时间点发生。比如:在同一时间点,一个人在扫地,一个人在刷碗。不涉及资源抢占
(如果两个人在同一时间点同一个刷碗池使用一套刷碗工具刷碗,这涉及到抢占刷碗工具资源,一个人占用刷碗工具,另一个人只能等待刷碗工具,这是并发)
 
并发(串行):两个或者多个事件在一个时间段内发生。比如:一个人一边煮饭,一边炒菜,精确到某一个时间点,只专注于干一件事,多个事之间是交替来执行的。
 
进程:一个内存中运行的应用程序,比如:电脑上运行QQ,一个QQ程序就是一个进程,开多个QQ程序就是多个进程。每个进程都有一个独立的内存空间,进程中的数据存储空间是独立的( 堆空间和栈空间)。进程是系统运行应用程序的基本单位。  一个进程至少有一个线程(主线程)。而java程序里一个进程至少有两个线程(主线程,GC线程)
 
线程:进程内部的一个独立执行单元。进程相当于一个单核CPU的操作系统,线程相当于这个操作系统里的多个任务。堆空间是共享的,栈空间是独立的。消耗的资源比进程小的多。
 
多线程优势:
1、进程之间不能共享内存,线程之间可以共享内存。
2、系统创建进程需要为该进程重新分配系统资源,而创建线程的代价要小得多,开销要小很多。所以在开发多任务运行时,通常先考虑创建多线程,而不是多进程。
3、java本身支持多线程的开发。
 
进程创建:
1、Runtime.exec()
2、ProcessBuilder.start();
线程创建:
1、继承Thread类。
    1、定义一个线程类 A 继承于 java.lang.Thread 类
    2、在 A 类中覆盖 Thread 类的 run() 方法
    3、在 run() 方法中编写需要执行的操作
    4、在 main 方法(线程)中,创建线程对象,并启动线程
        创建线程类:A类 a = new A()类;
        调用 start() 方法启动线程:a.start();
2、实现Runnable接口
    1、定义一个线程类 A 实现于 java.lang.Runnable 接口(注意:A类不是线程类,没有 start()方法,不能直接 new A 的实例启动线程)
    2、在 A 类中覆盖 Runnable 接口的 run() 方法
    3、在 run() 方法中编写需要执行的操作
    4、在 main 方法(线程)中,创建线程对象,并启动线程
        创建线程类:Thread t = new Thread( new A类() ) ;
        调用 start() 方法启动线程:t.start();
3、使用匿名内部类创建线程
                   
new Thread(new Runalbe() {
                    @Override
                    public void run() {
                        for (int i = 0; i < 10; i++) {
                            System.out.println("播放音乐" + i);
                        }
                    }

                }).start();

 

线程生命周期:
1、新建:new一个线程后,线程处于新建状态,此时jvm会为其分配内存,并初始化其成员变量的值。
2、就绪:线程对象调用start()方法,线程处于就绪状态,此时jvm会为其创建方法调用栈和程序计数器,等待调度。
3、运行:处于就绪状态的线程获得cpu,开始执行run()方法的线程执行体,线程进入运行状态。
4、阻塞:当运行状态的线程因为sleep(),IO阻塞,等待同步锁,等待通知,suspeng()时,进入阻塞状态。如果因为yield()或者失去处理器资源进入就绪状态。
5、死亡:线程在run()方法执行完后进入死亡状态,此外,线程执行了interrupt()和stop()方法,也会以异常退出的方式进入死亡状态。
 
 
三大特性:
1、原子性:一个操作是不可中断的,要么全部执行成功,要么全部执行失败。
2、可见性:一个线程修改了共享变量后,其他线程能够立即得知这个修改。
3、有序性:线程按照一定顺序执行,比如synchronized( 锁在同一时刻只能由一个线程进行获取,当锁被占用后,其他线程只能等待)
 
synchronized具有原子性、可见性、有序性
volatile具有可见性、有序性
posted on 2018-08-29 18:03  伊人撩月  阅读(148)  评论(0编辑  收藏  举报