Java中的park和unpark是用于線程同步的方法,它們可以實現阻塞和喚醒線程的操作。下面我們來詳細介紹一下它們的用法。
public static void park(Object blocker); public static void unpark(Thread thread);
park方法會使當前線程進入阻塞狀態,直到unpark方法喚醒它,或者當前線程被中斷。其中,blocker參數是一個任意類型的對象,用于標識這個park操作的唯一性,如果調用了阻塞線程 park方法,那么該線程就會被掛起,直到其他線程調用它的對象的 unpark方法為止。
unpark方法則是喚醒某個被阻塞的線程,讓其重新開始執行。其中,thread參數是被喚醒的線程對象。如果此時線程并未進入park狀態,則unpark方法也不會生效。
下面是一個使用park和unpark方法實現的生產者消費者代碼示例:
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("生產者生產了一件商品"); LockSupport.unpark(Thread.currentThread()); LockSupport.park(); } }); Thread consumer = new Thread(() ->{ while (flag) { LockSupport.park(); System.out.println("消費者消費了一件商品"); } }); producer.start(); consumer.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } flag = false; LockSupport.unpark(consumer); LockSupport.unpark(producer); } }
通過使用park和unpark方法,我們可以實現線程之間的同步、阻塞和喚醒操作。這對于多線程編程來說是非常重要和有用的。