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外,这样可以大大节省处理时间。
(谢谢观看,欢迎点评和纠错)