java基础之多线程一:概述
概述: 进程有多条执行路径, 合成为: 多线程. 进程和线程的描述: 进程: 可执行程序(文件), 例如: .exe//可以把进程理解为一辆车. 一台电脑上可以有多个进程, 这些进程之间的数据是相互隔离的.//例如: qq.exe, wechat.exe 线程: 线程是进程的执行路径(执行单元)//可以把线程理解为: 是马路 一个进程可以有多条线程, 这些线程可以共享该进程的数据.//例如: 往QQ群共享放一个文件, 该群中的所有的用户都可以下载. 进程依托于系统,线程依托于CPU 多线程并行和并发的区别: 并行: 两个(多个)线程同时执行. //前提: 需要多核CPU 并发: 两个(多个)线程同时请求执行, 但是CPU同一瞬间只能执行一个线程, 于是就安排这些线程交替执行, 因为时间间隔非常短, 我们看起来好像是同时执行的, 其实不是. 多线程的实现方式: 链接 方式一: 继承Thread类. 步骤: 1) 定义一个类(MyThread), 继承Thread类. 2) 重写Thread#run(). //重写Thread类中的run()方法. 3) 把要执行的代码放入run()方法中. 4) 在测试类中,创建线程对象. 5) 开启线程. //start() 好处: 代码相对比较简单. //因为是继承Thread类, 所以可以直接使用Thread类中的非私有成员. 弊端: 扩展性相对较差. //因为是继承, 而Java中类之间的继承只能单继承, 不能多继承, 但是可以多层继承. 注意事项: A: 如果调用run()方法, 只是普通的方法调用. B: 开启线程必须调用start()方法, 该方法会自动去调用run()方法. C: 同一线程不能重复开启, 否则会报: IllegalThreadStateException异常. 方式二: 实现Runnable接口. 步骤: 1) 定义一个类(MyRunnable), 实现Runnable接口. 2) 重写Runnable#run(). 3) 把要执行的代码放入run()方法中. 4) 在测试类中, 创建Runnable接口的子类对象, MyRunnable mr = new MyRunnable(); 并将其作为参数传入Thread类的构造, 创建线程对象. Thread th = new Thread(mr); 5) 开启线程. //start() 好处: 扩展性相对较强. 弊端: 代码相对比较 繁琐. 方式三: 结合线程池使用(实现Callable接口). Thread类中的成员: 构造方法: public Thread(); public Thread(String name); public Thread(Runnable target); public Thread(Runnable target,String name); 成员方法: run(); //里边定义的是线程要执行的代码, 该方法会自动被start()方法调用. start(); //开启线程, 会自动调用run(). getName(); setName(); sleep(); //休眠线程, 单位是: 毫秒. currentThread(); //获取当前正在执行的线程对象(的引用). 多线程同步: 链接 概述/作用: 多线程(环境) 并发 操作同一数据, 有可能引发安全问题, 就需要用到同步解决. 分类: 同步代码块: 格式: synchronized(锁对象) { //要加锁的代码 } 锁对象: 1) 同步代码块的锁对象可以是任意类型的对象. 2) 必须使用同一把锁, 否则可能出现锁不住的情况. 同步方法: 静态方法: 锁对象: 该类的字节码文件对象. 非静态方法: 锁对象: this 多线程的生命周期 新建, 就绪, 运行(有可能会发生阻塞(系统控制) 或者 等待(可人为控制)状态), 死亡.