Java

java 新建线程怎样处理线程等待

小樊
81
2024-11-29 17:01:57
栏目: 编程语言

在Java中,处理线程等待的方法有很多种。这里,我将向您展示如何使用wait()notify()方法来处理线程等待。这两个方法都是Object类的方法,因此所有的Java对象都可以使用它们。

首先,我们需要创建一个共享资源,例如一个整数变量,以便在线程之间进行通信。我们将使用synchronized关键字来确保在同一时间只有一个线程可以访问这个资源。

public class SharedResource {
    private int counter = 0;

    public synchronized void increment() {
        counter++;
        System.out.println(Thread.currentThread().getName() + " incremented counter to: " + counter);
        notifyAll(); // 通知等待的线程
    }

    public synchronized void decrement() {
        counter--;
        System.out.println(Thread.currentThread().getName() + " decremented counter to: " + counter);
        notifyAll(); // 通知等待的线程
    }

    public synchronized int getCounter() {
        return counter;
    }
}

接下来,我们将创建两个线程类,一个用于递增计数器,另一个用于递减计数器。在这两个类中,我们将使用wait()方法来让线程等待,直到另一个线程调用notifyAll()方法。

public class IncrementThread extends Thread {
    private SharedResource sharedResource;

    public IncrementThread(SharedResource sharedResource) {
        this.sharedResource = sharedResource;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (sharedResource) {
                while (sharedResource.getCounter() >= 10) {
                    try {
                        System.out.println(Thread.currentThread().getName() + " is waiting...");
                        sharedResource.wait(); // 让当前线程等待
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                sharedResource.increment();
            }
        }
    }
}

public class DecrementThread extends Thread {
    private SharedResource sharedResource;

    public DecrementThread(SharedResource sharedResource) {
        this.sharedResource = sharedResource;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (sharedResource) {
                while (sharedResource.getCounter() <= 0) {
                    try {
                        System.out.println(Thread.currentThread().getName() + " is waiting...");
                        sharedResource.wait(); // 让当前线程等待
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                sharedResource.decrement();
            }
        }
    }
}

最后,我们需要在main()方法中创建这些线程并启动它们。

public class Main {
    public static void main(String[] args) {
        SharedResource sharedResource = new SharedResource();
        IncrementThread incrementThread = new IncrementThread(sharedResource);
        DecrementThread decrementThread = new DecrementThread(sharedResource);

        incrementThread.start();
        decrementThread.start();
    }
}

这个示例中,IncrementThreadDecrementThread线程将不断地递增和递减共享资源counter。当一个线程试图执行操作时,如果counter不满足条件(例如,递增线程试图递增计数器,但计数器已经达到10),则线程将调用wait()方法并进入等待状态。另一个线程执行操作并调用notifyAll()方法时,等待的线程将被唤醒并继续执行。

0
看了该问题的人还看了