一、线程概述
1、线程是什么?
线程是进程中一个顺序的执行流,在程序中表现为一个对象,多个这样的对象可以并发执行
2、进程是什么?
是一个正在运行的程序,一个进程中可以有一个线程或多个线程
3、线程的应用
当我们需要并发的处理多个任务时,可以使用多个线程,
例如:下载文件,加载图片,播放音乐...
4、多线程应用中的优劣势
1)优势:①提高系统的并发处理能力 ②改善用户体验
2)劣势:①数据的安全不好控制②代码的调试、维护难度加大
二、线程对象的创建、启动、运行
线程对象的类型为Thread类,启动线程对象需调用Thread对象的start方法;
线程在获得CPU执行时,会调用Thread对象的run方法,如果有任务需要交给线程执行,通常是在run方法中调度。run方法不能自己调用,但是可以重写;
启动线程,调用Thread类的start方法。
线程何时运行存在不确定性。
三、线程对象的状态
1、新建状态(new):new Thread(){}
2、就绪状态(start):调用线程对象的start()方法
3、启动状态(run):获得cpu,执行线程对象的run()方法
4、阻塞状态(sleep):sleep(),调用对象锁的wait()方法,注意,一般不应让主线程处于阻塞状态,而是让工作线程等待
5、死亡状态(dead):run()方法运行结束,该线程处于死亡状态
Thread tr=new Thread(){
@Override
public void run() {
Log.i("TAG", "run()方法");
super.run();
}
};
tr.start();//启动一个进程;
}
四、线程的相关方法
1) start():启动线程,此时线程处于就绪状态,等待获得cpu启动线程
2)run():线程运行时执行此方法
3)sleep():让当前线程休眠,同时让出CPU
4)setName():给线程起名字
5)getName():获得当前线程的名字
6)isAlive():判定线程是否还活着
7)setPrPriority():给线程设置优先级(MIN_PRIORITY=1,NORM_PRIORITY=5,MAX_PRIORITY=10)
8)setDeamon(true);设置线程为守护线程(启动之前设置),守护线程一般为服务性线程,当没有其他线程在执行时,守护线程会自动销毁。
9)join(时间);插入式线程,调用此方法的线程会优先执行,例如A线程正在执行,此时在A线程的run方法调用了B线程的join方法,那么A线程阻塞,B线程开始执行。
10)currentThread();静态方法获得当前线程
相关问题:
1)线程对象创建以后,可以调用run方法启动吗?不可以
2)线程对象启动以后,线程会立即执行run方法吗?不确定
3)多个线程可以并发执行吗?可以
4)工作线程中可以启动工作线程吗?可以
5)多个线程可以并发执行同一个任务吗?可以
五、Java中线程的同步
1、线程同步的概述
线程的同步多个线程有次序的执行各自的业务,多个线程并发执行时,在共享数据集上的互斥与协作;
互斥是为了保证数据的安全,协作是让多个线程在共享数据集上进行通讯,以确保业务的合理性。
2、java中线程的互斥
多线程的互斥指的是让多个线程在共享数据集上排队执行
实现方法:对共享数据集加锁
1)同步代码块synchronized(对象锁){}
2)同步方法
a)public synchronized void method01(){}实例方法对象锁默认为this
b)Public static synchronized voidmethod02(){}静态方法对象锁默认为“类名.class”(类对象)
回顾:
Vector是一个线程安全的ArrayList
HashTable是一个线程安全的HashMap
说明:现在已经不推荐使用Vetor和HashTable对象了,因为执行的效率比较低,可以考虑将线程不安全的集合转换为线程安全集合,例如执行list = Collections.synchronizedList(list);或者也可以考虑使用java.util.concurrent包下的一些集合,例如ConcurrentHashMap.
HashTable对整个底层哈希表上锁,ConcurrentHashMap是对底层哈希表分段进行加锁。
3、java中线程的协作
线程协作构建于线程互斥基础上,需要借助Object类的wait,notify,notifyall方法实现,以保证数据业务的合理性。
相关方法含义:
1)wait 调用此方法的线程阻塞,同时释放对象锁
2)notify/notifyall通知具备相同锁并且处于等待状态的线程开始执行
方法应用说明
1)wait,notify,notifyall必须用在同步代码块或同步方法中
2)wait,notify,notifyall必须由对象锁调用
案例:生产者消费者应用模型
1)生产者线程对象
2)消费者线程对象
3)容器对象(存储生产放的数据)
要求:生产者可以不断向容器(容器有大小限制)放数据,消费者可以不断的从容器中取数据。