Java中的線程阻塞和掛起是指線程被暫時(shí)停止執(zhí)行,并等待一定條件的發(fā)生,然后繼續(xù)執(zhí)行。
阻塞和掛起的區(qū)別在于,阻塞是在等待某些條件的發(fā)生時(shí),線程是不能繼續(xù)執(zhí)行的;而掛起是線程主動(dòng)暫停自己的執(zhí)行,并等待喚醒信號(hào)。
// 以下是一段阻塞線程的代碼示例 public class BlockThreadExample implements Runnable { @Override public void run() { synchronized (this) { try { wait(); // 線程在此被阻塞 } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { BlockThreadExample example = new BlockThreadExample(); new Thread(example).start(); synchronized (example) { example.notify(); // 發(fā)送信號(hào)喚醒線程 } } }
// 以下是一段掛起線程的代碼示例 public class SuspendThreadExample implements Runnable { private boolean isPaused = false; @Override public void run() { while (true) { if (isPaused) { Thread.currentThread().suspend(); // 線程在此被掛起 } System.out.println("Thread is running..."); } } public void pause() { isPaused = true; } public void resume() { isPaused = false; Thread.currentThread().interrupt(); // 發(fā)送中斷信號(hào)喚醒線程 } public static void main(String[] args) throws InterruptedException { SuspendThreadExample example = new SuspendThreadExample(); Thread thread = new Thread(example); thread.start(); Thread.sleep(3000); example.pause(); // 暫停線程 Thread.sleep(3000); example.resume(); // 恢復(fù)線程 } }
以上兩段代碼分別演示了阻塞線程和掛起線程的過程,需要注意的是,在實(shí)際應(yīng)用中,線程的阻塞和掛起都應(yīng)該盡量避免,因?yàn)樗麄兛赡軙?huì)帶來一些不可預(yù)測(cè)的問題,如死鎖、饑餓等。通常情況下,我們應(yīng)該使用線程池、鎖、信號(hào)量等方式來控制線程的執(zhí)行。