在Java中,线程阻塞通常是由于线程在等待某个条件满足或者等待某个资源可用而导致的。为了处理线程阻塞,我们可以采用以下几种方法:
public class BlockingExample { private static final Object lock = new Object(); public static void main(String[] args) { Thread thread1 = new Thread(() -> { synchronized (lock) { System.out.println("Thread 1 acquired lock"); try { // 模拟等待条件满足 Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread 1 released lock"); } }); Thread thread2 = new Thread(() -> { synchronized (lock) { System.out.println("Thread 2 acquired lock"); System.out.println("Thread 2 released lock"); } }); thread1.start(); thread2.start(); } }
public class BlockingExample { private static final Object lock = new Object(); public static void main(String[] args) { Thread thread1 = new Thread(() -> { synchronized (lock) { System.out.println("Thread 1 acquired lock"); try { // 模拟等待条件满足 lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread 1 released lock"); } }); Thread thread2 = new Thread(() -> { synchronized (lock) { System.out.println("Thread 2 acquired lock"); // 模拟条件满足 System.out.println("Notifying Thread 1"); lock.notify(); System.out.println("Thread 2 released lock"); } }); thread1.start(); thread2.start(); } }
import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class BlockingExample { public static void main(String[] args) { BlockingQueue<String> queue = new LinkedBlockingQueue<>(1); Thread thread1 = new Thread(() -> { try { String item = queue.take(); System.out.println("Thread 1 received: " + item); } catch (InterruptedException e) { e.printStackTrace(); } }); Thread thread2 = new Thread(() -> { try { queue.put("Hello"); System.out.println("Thread 2 sent: Hello"); } catch (InterruptedException e) { e.printStackTrace(); } }); thread1.start(); thread2.start(); } }
这些方法都可以用于处理Java线程阻塞问题。在实际应用中,我们需要根据具体场景选择合适的方法来实现线程间的通信和协作。