对Java多线程技能中所有要领的具体理会
副标题#e#
一、run()和start()
这两个要领应该都较量熟悉,把需要并行处理惩罚的代码放在run()要领中,start()要领启动线程将自动挪用 run()要领,这是由Java的内存机制划定的。而且run()要领必需是public会见权限,返回值范例为void。
二、要害字Synchronized
这个要害字用于掩护共享数据,虽然前提是要分清哪些数据是共享数据。每个工具都有一个锁符号,当一个线程会见该工具时,被Synchronized修饰的数据将被“上锁”,阻止其他线程会见。当前线程会见完这部门数据后释放锁符号,其他线程就可以会见了。
public ThreadTest implements Runnable
{
public synchronized void run(){
for(int i=0;i<10;i++)
{
System.out.println(" " + i);
}
}
public static void main(String[] args)
{
Runnable r1 = new ThreadTest();
Runnable r2 = new ThreadTest();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
以上这段措施中的 i 变量并不是共享数据,也就是这里的Synchronized要害字并未起浸染。因为t1,t2两个线程是两个工具(r1,r2)的线程。差异的工具其数据是差异的,所以r1和r2两个工具的i变量是并不是共享数据。
当把代码改成如下:Synchronized要害字才会起浸染
Runnable r = new ThreadTest();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
#p#副标题#e#
三、sleep()
使当前线程(即挪用该要领的线程)暂停执行一段时间,让其他线程有时机继承执行,但它并不释放工具锁。也就是假如有Synchronized同步块,其他线程仍然差异会见共享数据。留意该要领要捕捉异常
好比有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,假如没有Sleep()要领,只有高优先级的线程执行完成后,低优先级的线程才气执行;但当高优先级的线程sleep(5000)后,低优先级就有时机执行了。
总之,sleep()可以使低优先级的线程获得执行的时机,虽然也可以让同优先级、高优先级的线程有执行的时机。
四、join()
join()要领使挪用该要领的线程在此之前执行完毕,也就是期待挪用该要领的线程执行完毕后再往下继承执行。留意该要领也要捕捉异常。
五、yield()
它与sleep()雷同,只是不能由用户指定暂停多长时间,而且yield()要领只能让同优先级的线程有执行的时机。
六、wait()和notify()、notifyAll()
这三个要领用于协调多个线程对共享数据的存取,所以必需在Synchronized语句块内利用这三个要领。前面说过Synchronized这个要害字用于掩护共享数据,阻止其他线程对共享数据的存取。可是这样措施的流程就很不机动了,如何才气在当前线程还没退出Synchronized数据块时让其他线程也有时机缘见共享数据呢?此时就用这三个要领来机动节制。
wait()要领使当前线程暂停执行并释放工具锁符号,让其他线程可以进入Synchronized数据块,当前线程被放入工具期待池中。当挪用 notify()要领后,将从工具的期待池中移走一个任意的线程并放到锁符号期待池中,只有
锁符号期待池中的线程可以或许获取锁符号;假如锁符号期待池中没有线程,则notify()不起浸染。
notifyAll()则从工具期待池中移走所有期待谁人工具的线程并放到锁符号期待池中。
留意 这三个要领都是java.lang.Ojbect的要领!
文章来历:http://java.ccidnet.com/art/3539/20070529/1093639_1.html