Java 线程(Thread)技术与深入理解

版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/82875228

Thread基础部分

在各种编程语言中都有thread(线程)技术,线程保证在一个main中(主线程)可以同时进行两个或多个不同的事件,通俗点说就是你在上厕所的同时还可以玩手机,是吧!美滋滋。而Thread就相当于提供了同时做两件事的条件和环境。接下来在深入一点理解计算机中的Thread技术,Thread技术本质上并不是使事情同时来进行,而是使事件看起来是同时进行的。举个例子吧:

     先在有个Buddhist(和尚)和一个Confucian(秀才),他们分别要这样两件事,Buddhist每天念100遍经文“ma mi ma mi hong 。。。”,Confucian每天要念200遍三字经“人之初,性本善。。。”,他们两个每天是在各自做各自的事情,相当于两个Threads。从计算机的角度讲,相当于计算机先让Buddhist念几遍经文,在让Confucian念几遍三字经,不过计算机让每个人念的时间很短,而两个人又念的很快(计算机处理速度快),人肉眼看来就相当于两个人在同时进行各自的事情。

专业一点讲:在计算机系统中有个缓冲区,在缓冲区中多个线程排着队(允许有优先级)等待系统调取执行,执行的时候每个线程只分配很端的时间(微秒),就这样这些线程执行完后可以设置一个睡眠时间(sleep)使本线程先休息一下给其他线程腾点cpu,等sleep结束之后本线程会进入缓冲区中排队等待下次被执行(注:并不是一sleep结束就立刻被执行)。

//Create Thread

(1)extands Thread实现

        public class Buddhist extends Thread   //继承Thread

        {

               public void run( )   //重写run method

              {

                 Thread.sleep(100);  //sleep 100ms

                  执行体       //Buddhist念经

              }

      }

  Buddhist bhst=new Buddhist( );

  bhst.start( );    //Thread的入后(启动)

(2)Runable interface实现

        public class Buddhist implements   Runnable   //继承Thread的指定interface

        {

               public void run( )   //重写run method

              {

                 Thread.sleep(100);  //sleep 100ms

                  执行体       //Buddhist念经

              }

       }

  Thread t=new Thread(new Buddhist( ) );

t.start( ) ;

(3)匿名类

  Thread t=new Thread()

    {

        public void run( )

        {  执行体 }

    }

    t.start( );


Thread高级部分(同步机制与通知机制)

(1)同步机制:

      当两个或多个线程同时访问一个数据的时候就容易出现问题。比如一个线程从byte[ ] data中写数据,另一个线程从data中读数据,由于两个线程分别工作一会让另一个工作一会,这就容易导致一个线程还没写好而另一个线程就要读数据,最终会导致数据出现偏差而影响程序正常的进行,而程序员还不容易查到原因(并不是语法错误)。此时就映入了同步(synchornized)机制,其实就是C++中的互斥锁机制,都伴随着一个上锁、解锁的过程,不过C++中要locked和unlocked,而Java中直接synchornized(对象)就可以了。

        synchronized(对象)

        {

         }

         public synchronized  void  compared(parameter)

        {

         }


(2)deadLock(死锁):

   Java存在synchornized机制(互斥锁),同时也会带来deadlock,不合理的时用synchornized就容易产生死锁,导致线程永久等待。

1.锁中再加锁人分离:你在上厕所,外面却有个你在厕所外敲门。

        synchronized(对象data)

        {        

                  synchronized(同一对象da'ta)

                 {

                 }

         }

2.互相锁住定终生:我把一号门锁了敲二号门,他把二号门锁了敲一号门。我他隔门相对定终身。

      //Thread1中    

       synchronized(对象data1)

        {        

                  synchronized(对象data2)

                 {

                 }

         }

//Thread2中

synchronized(对象data2)

        {        

                  synchronized(对象data1)

                 {

                 }

         }


(3)通知机制(notify/wait):

顾名思义就是通知的味道。通知机制是为了保证数据被存入后被即使的取出,防止数据积累带来不好的影响。

为了即使取走数据有两种方法:轮询机制(让取东西的线程不断的检查,但可能空跑一趟)

                                                   通知机制(当存入数据后通知另一个线程来取数据)

    两种机制特点 :     轮询机制:实现比较简单,但效率低。

                                    通知机制:实现起来比较复杂,但效率高。

notify/wait实现:

wait / notify 是Object类的方法 
 
发出通知

 synchronized (basket)  

{  

            basket.add(egg);  

            basket.notify();    //发出通知

}

等待通知  

synchronized (basket)

 {        

               try  { basket.wait(); }            //等待接收通知

               catch (InterruptedException e) {}  

               if(basket.size() > 0)

                      egg = basket.remove(0);

  }  

注:notify/wait机制必须在同一synchornized下进行(notify/wait与synchornized作用对象一样),这是Java特定的机制,必须这么使用(官方说法是,在 wait/notify之前,必须先成为该对象的监视者Monitor) 。尽量将耗时且与notify/wait作用对象无关的处理放在notify/wait外,这样可以大大节省处理时间。

(谢谢观看,欢迎点评和纠错)

猜你喜欢

转载自blog.csdn.net/biggerchong/article/details/82875228