1 什么是线程?
线程是程序执行流的最小单位,进程是线程的容器,一个进程可以有一个或多个线程,各个线程共享进程的内存.进程是操作系统控制的最小单位,线程是CPU调度的最小单位。
当我们启动一个App的时候,Android系统会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread。通常一个应用的所有组件都运行在这一个Process中,当然,你可以通过修改四大组件在Manifest.xml中的代码块()中的android:process属性指定其运行在不同的process中。当一个组件在启动的时候,如果该process已经存在了,那么该组件就直接通过这个process被启动起来,并且运行在这个process的UI Thread中。
1.1 Android启动多线程的基本方法包括2种
类Thread
接口Runnable
其他方法:最终通过以上方法封装的
1.2 线程状态
Java中线程的状态分为6种:
1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
3. 阻塞(BLOCKED):表示线程阻塞于锁。
4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。1
5. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
6. 终止(TERMINATED):表示该线程已经执行完毕。
2 java 安全锁类型
锁的分类方法有很多,这里将java的锁分为两类 隐示锁和显示锁;
synchronized :因为它是由jdk内部实现加锁、解锁,程序员无法自己处理,称为隐式锁,也叫内置锁。
一种情况 synchronized 持有 xxx.class对象锁 称为类锁。
一种情况synchronized持有一把object对象锁 称为对象锁
Lock :程序员可以自己控制 加锁 解锁等逻辑
实例如下:
public class Test {
int i=0;
/**
* synchronized 持有Test.class对象锁 -> 类锁
*/
public synchronized void count(){
i++;
System.out.println(i);
}
public void count2(){
/**
* synchronized 持有Test()对象锁 -> 类锁
*/
synchronized (this){
i++;
System.out.println(i);
}
}
public void count3(){
/**
* synchronized 持有Test.class对象锁 -> 类锁
*/
synchronized (Test.class){
i++;
System.out.println(i);
}
}
private Object object=new Object();//这里作为一个锁
public void count4(){
/**
* synchronized 持有Object的对象锁 -> 对象锁
*/
synchronized (object){
i++;
System.out.println(i);
}
}
// 声明一个显示锁之可重入锁 new 可重入锁
// 非公平锁
private Lock lock = new ReentrantLock();
public void count5(){
lock.lock();
try{
i++;
}finally {
System.out.println(i);
lock.unlock();
}
}
static class MyThread extends Thread{
private Test test;
public MyThread(Test test) {
this.test = test;
}
@Override
public void run() {
super.run();
for (int i=0;i<20000;i++){
//test.count();
//test.count2();
//test.count3();
test.count4();
//test.count5();
}
}
}
public static void main(String[] args) {
Test t=new Test();
MyThread t1=new MyThread(t);
MyThread t2=new MyThread(t);
MyThread t3=new MyThread(t);
t1.start();
t2.start();
t3.start();
}
}