线程的介绍:
线程是进程中一个顺序的执行流,是进程中的一个最小执行单位,进程内部的所有线程共享进程内存。进程间内存相互独立。
进程是操作系统中正在运行的一个程序(应该),一个多任务操作系统可以并发的执行多个进程,而进程的并发严格来讲是进程中线程的并发。
多线程应用场景
1)多个并发下载任务2)音乐播放的同时还对其进行缓存(下载)
3)边网络加载数据时,边听歌
线程创建:
a)构建Thread类的子类对象然后重写run方法b)构建Thread类对象的同时传入Runnable类型对象(这个对象可以看成是一个要执行的任务)
线程启动:借助start方法让线程处于就绪状态
线程运行:线程启动以后一旦获得cpu就会执行run方法.
public class MyClass { public static void main(String[] args){ System.out.println("main_helloword"); new Thread(){//构建线程类型的子类类型的对象,并启动 @Override public void run() { System.out.println("work_01_hello"); } }.start(); new Thread(new Runnable() {//构建Thread类对象的同时传入Runnable类型对象 @Override public void run() { System.out.println("work_02_hello"); } }).start(); } }
相关状态:
1)新建状态 (新创建的线程,还没有启动)2)就绪状态 (启动了线程或者休眠的线程醒了)
3)运行状态 (线程正在执行run方法)
4)阻塞状态 (线程休眠或IO)
5)死亡状态 (线程run方法结束)
相关方法:
1)start(启动线程时执行,负责启动线程,只能启动1次)2)run(线程运行时执行,一般用于执行业务)
3)sleep(阻塞当前线程,并让出CPU);
4)interrupt(唤醒线程对象)
5)currentThread(获得当前线程对象)
6)setName(设置线程的名字)
7)getName(获得线程的名字)
8)setDaemon(true)设置线程为守护线程(精灵线程)
9)isAlive()判定线程是否还活着
10)................
线程同步:
线程同步是多线程在共享数据集上的互斥与协作。
互斥:多线程在共享数据集上排队执行。
协作:多线程在共享数据集上协作执行.
多线程互斥的实现
应用场景:
1)多个线程
2)有共享数据集
3)共享数据集上的操作可以拆为多步执行,为非原子操作(原子操作指的是不可分割,是一个整体,操作一个整体)
怎么进行互斥的实现?对共享数据集加锁 (锁是唯一的,如果锁为对象,那么对象只创建了一个)
1)同步代码块synchronized (LOCK) {}
2)同步方法: 分实例方法和静态方法
a)public synchronized void put(this){}//锁为this
b)public static synchronized void take(){}//锁为对象或者类名.class
注:
a)实例方法默认使用this作为对象锁
b)静态方法默认使用类对象(类名.class)作为对象锁
回顾:
1)StringBuffer是一个线程安全的StringBuilder
2)ArrayList是一个线程不安全的集合
3)HashMap是一个线程不安全的集合
在线程不全的环境使用集合时要考虑线程安全集合的应用,例如:
1)Collections.synchronizedList(list)
2)ConcurrentHashMap 线程安全并且高效的hashmap
3).............
3.Android 线程同步中的线程协作。
Android 或java中线程之间的协作构建于互斥的基础之上,是在同步代码块或同步方法中,借
助Object类的wait,notify,notifyall方法实现。
1)wait:表示等待,调用此方法的线程会阻塞,同时让出CPU.
2)notify/notifyall,表示通知,调用此方法的线程用于通知具备相同锁对象的其它线程开始执行。
方法应用说明:
1)wait,notify/notifyall必须用在 同步代码块或同步方法中。
2)wait,notify/notifyall必须由对象锁有调用。