彻底搞定Thread类和Runnable接口

来源:互联网 发布:学统计跟大数据 编辑:程序博客网 时间:2024/05/16 19:14

首页要明确三点:第一点Thread类跟Runnable接口是什么。

                            第二点Thread类跟Runnable接口干什么用的。

                            第三点Thread类跟Runnable接口在什么时候用。

                    线程

                          1  线程,什么是线程:线程是操作系统能够运算调度的最小单位,它包括在进程中,是进程中的实际运作单位。

                          2.线程干什么用,线程是对运行密集的任务进行提速的。

                          3.线程在什么时候用,比如一个线程完成一个任务100毫秒,那么用十个线程完成任务只需10毫秒。

                     了解一下线程与进程的区别

                             线程是进程的子集,一个进程可以有多个线程,每个线程并行执行不同的任务。

                             不同的进程使用不同的内存空间,所有的线程共享一片相同的内存空间。                                     

明确了线程的概念、作用、什么时候使用之后,一步一步揭开java线程Thread、Runnable的神秘面纱。

java中实现线程有俩种方式:

                   1Thread类的实例就是一个线程,但是它是调用Runnable接口来执行的。

                   2.Runnable接口,由于线程本身就是调用的Runbale接口,所以可以继承Thread类或者直接实现Runnable接口方法重写run方法来实现线程。

                   (那么在开发中是使用继承Thread类还是实现Runbale接口呢,那个方法更好呢?java不支持多重继承,但允许调用多个接口,如果你继承其他类就调用Runnable接口)

                   Thread类中的onStart()和run()方法的区别

                            onStart()方法被用来启动创建新的线程。run()方法是重写运行方法用来执行逻辑代码的。通俗讲,onStart()是启动,run()是执行任务

                  方法介绍:

                             1.join方法:功能是使异步执行的线程变成同步。即调用线程实例的onStrat(),该方法就会立即返回,如果调用Strat方法之后,需要使用一个由线程计算得到值,就必调用该方法。如果不调用join方法,就不能保证当执行到onStart方法后面的语句,这个线程就会执行完毕,而使用join方法之后,直到这个线程退出,程序才会往下执行。

Ps:没有加join方法  ,异步执行

public classTestJoin {

    public static void main(String[] args) {

        MyThread3t3=new MyThread3("MyThrea3");

        t3.start();

/

        MyThread2t1 = new MyThread2("MyThrea 1111111");

        t1.start();

 

   

        for(inti=0 ; i <10;i++)

            System.out.println("I am Main Thread");

    }

}

 

class MyThread2extends Thread {

    public MyThread2(Strings){

        super(s);

    }

 

    public void run() {

        for(inti = 1; i <= 10;i++) {

            System.out.println("I am "+getName());

            try {

                sleep(1000);//暂停,每一秒输出一次

            }catch (InterruptedExceptione) {

                return;

            }

        }

    }

}

I am MyThrea3

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am MyThrea 1111111

I am MyThrea3

I am MyThrea 1111111

I am MyThrea3

I am MyThrea 1111111

I am MyThrea3

I am MyThrea 1111111

I am MyThrea3

I am MyThrea 1111111

I am MyThrea3

I am MyThrea 1111111

I am MyThrea3

I am MyThrea 1111111

I am MyThrea3

I am MyThrea 1111111

I am MyThrea3

I am MyThrea 1111111

I am MyThrea3

I am MyThrea 1111111

//加上join方法之后按顺序执行,即同步,比如线程T1T2  T3 想要T3在线程T1之前执行 那么使用join方法即可实现该功能。

public classTestJoin {

 

 

    public static void main(String[] args) {

 

        MyThread3t3=newMyThread3("MyThrea3");

        t3.start();

        try {

            t3.join(); //join()合并线程,子线程运行完之后,主线程才开始执行

            }catch (InterruptedExceptione) {  }

// 

        MyThread2t1 = new MyThread2("MyThrea 1111111");

        t1.start();

        try {

        t1.join();  //join()合并线程,子线程运行完之后,主线程才开始执行

        }catch (InterruptedExceptione) {  }

 

 

       

        for(inti=0 ; i <10;i++)

            System.out.println("I am Main Thread");

    }

}

 

class MyThread2extends Thread {

    public MyThread2(Strings){

        super(s);

    }

 

    public void run() {

        for(inti = 1; i <= 10;i++) {

            System.out.println("I am "+getName());

            try {

                sleep(1000);//暂停,每一秒输出一次

            }catch (InterruptedExceptione) {

                return;

            }

        }

    }

}

I am MyThrea3

I am MyThrea3

I am MyThrea3

I am MyThrea3

I am MyThrea3

I am MyThrea3

I am MyThrea3

I am MyThrea3

I am MyThrea3

I am MyThrea3

I am MyThrea 1111111

I am MyThrea 1111111

I am MyThrea 1111111

I am MyThrea 1111111

I am MyThrea 1111111

I am MyThrea 1111111

I am MyThrea 1111111

I am MyThrea 1111111

I am MyThrea 1111111

I am MyThrea 1111111

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

I am Main Thread

2.java线程中的Lock接口,

Lock接口分别为读和写提供了锁,

读写锁ReadWirteLock可以细分为读锁和解锁。

读锁可以允许多个进行读操作的线程同时进入,但不允许同时多个线程写入。

ReadWriteLock rwl = new ReentrantReadWriteLock();  

读挂锁: rwl.readLock().lock();  //读锁开启,读线程均可进入  

读解锁:  rwl.readLock().unlock(); //读锁解锁 一般tryfinally里面

写挂锁: rwl.writeLock().lock();  //写锁开启,这时只有一个写线程进入  

写解锁:  rwl.writeLock().unlock(); //写锁解锁  一般tryfinally里面

3. synchronized能够保证同一时刻最多一个线程执行该段代码。(举个不恰当的例子,就比如说卫生间一次只能进一个人一样,当A进入卫生间后会在卫生间里面挂一把锁,别人是进不来的,当A走出卫生间的时候就会把锁去掉,然后B才可以进到卫生间)

4.wait方法

 Wait是让线程等待是属于object的方法,在等待的同时会释放锁,通常用于线程间的交互。Notity和notifyAll只能在同步控制方法或者同步控制块里面使用。

5.sleep方法

  Sleep方法也是让线程等待的方法,属于Thread的静态方法,任何地方都可以释放,并必须捕捉异常。  

6.线程的阻塞队列

   阻塞队列是一个支持俩个附加操作的队列。在队列为空的时候,获取元素的线程队列会等待wait,写入元素的线程队列会开始写元素,当写入元素的大小为设定大小时,写入对队列线程会等待并且添加到阻塞队列wait同时它会唤醒阻塞队列中获取元素的队列线程到就绪队列 notify();  

 

7.volatile在多线程中是用来同步变量的。 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。