线程Thread

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();

    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。