读思码

日常记录


多线程基本函数

<p>[TOC]</p> <h1>1.Thread的静态方法sleep()和yield()和thread对象的方法join()</h1> <p>sleep()和yield()是Thread类的静态方法,join()是Thread对象的方法;wait()、notify()和notifyAll()是Object的方法。 wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中; 在执行notify()或notifyAll()方法后,当前线程不会马上释放该对象锁,需要等到notify()或notifyAll()方法所在的同步方法或同步代码块执行完成,当前线程才会释放锁。</p> <p>当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。 notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。</p> <h1>2.Object的方法wait(),notify(),notifyAll()</h1> <p>wait(),notify(),notifyAll()这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用这三个方法。</p> <h1>3.总结</h1> <ol> <li>sleep会让出cpu时间片,其他任何优先级的线程都有机会获得cpu,但是不会释放锁;需要捕捉异常。</li> <li>yield让出cpu调度,类似sleep不会释放锁,但是不能指定暂停多少时间,只能让同优先级的线程有执行机会,当前线程重新回到可执行状态,可能又立马执行。</li> <li>wait必须和notify或者notifyAll同时使用,必须放在同步代码块中,执行该方法会释放锁,进入线程等待池中等待被再次唤醒(notify随即唤醒,notifyAll全部唤醒,线程结束自动唤醒),即放入锁池中竞争同步锁。如果不是在同步方法或同步代码块中调用wait()方法,则抛出IllegalMOnitorStateException,它是RuntimeException的一个子类,因此,不需要try-catch语句进行捕捉异常。</li> <li>join是一种特殊的wait,在调用join的线程对象执行完之后再执行当前线程。需要捕捉异常。</li> </ol> <h1>3.Thread.sleep()和Thread.currentThread.sleep()的区别</h1> <p>推荐Thread.sleep(),因为sleep是静态方法,都是当前的额线程sleep,静态方法不应该通过实例调用。 无论是currentThread.sleep()或者otherThread.sleep()最后sleep的都会是curentThread,而不会是otherThread。 yeild()同理。</p>

页面列表

ITEM_HTML