Java中的park和unpark是用于線程同步的方法,它們可以實(shí)現(xiàn)阻塞和喚醒線程的操作。下面我們來詳細(xì)介紹一下它們的用法。
public static void park(Object blocker); public static void unpark(Thread thread);
park方法會使當(dāng)前線程進(jìn)入阻塞狀態(tài),直到unpark方法喚醒它,或者當(dāng)前線程被中斷。其中,blocker參數(shù)是一個(gè)任意類型的對象,用于標(biāo)識這個(gè)park操作的唯一性,如果調(diào)用了阻塞線程 park方法,那么該線程就會被掛起,直到其他線程調(diào)用它的對象的 unpark方法為止。
unpark方法則是喚醒某個(gè)被阻塞的線程,讓其重新開始執(zhí)行。其中,thread參數(shù)是被喚醒的線程對象。如果此時(shí)線程并未進(jìn)入park狀態(tài),則unpark方法也不會生效。
下面是一個(gè)使用park和unpark方法實(shí)現(xiàn)的生產(chǎn)者消費(fèi)者代碼示例:
import java.util.concurrent.locks.LockSupport; public class ProducerConsumer { private static volatile boolean flag = true; public static void main(String[] args) { Thread producer = new Thread(() ->{ while (flag) { System.out.println("生產(chǎn)者生產(chǎn)了一件商品"); LockSupport.unpark(Thread.currentThread()); LockSupport.park(); } }); Thread consumer = new Thread(() ->{ while (flag) { LockSupport.park(); System.out.println("消費(fèi)者消費(fèi)了一件商品"); } }); producer.start(); consumer.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } flag = false; LockSupport.unpark(consumer); LockSupport.unpark(producer); } }
通過使用park和unpark方法,我們可以實(shí)現(xiàn)線程之間的同步、阻塞和喚醒操作。這對于多線程編程來說是非常重要和有用的。