legongju.com
我们一直在努力
2024-12-23 20:44 | 星期一

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

在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()方法时,等待的线程将被唤醒并继续执行。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/52134.html

相关推荐

  • java unsafe类怎样规避问题

    java unsafe类怎样规避问题

    Java的Unsafe类是一个非常强大但同时也非常危险的工具,因为它提供了对内存和系统资源的不受限制访问。使用Unsafe类可以绕过Java的内存管理和垃圾回收机制,这可...

  • java unsafe类和反射关系

    java unsafe类和反射关系

    Java中的Unsafe类和反射之间存在一定的关系,但它们在使用场景和功能上有很大的区别。 Unsafe类:
    Unsafe类是Java的一个本地(native)方法库,它提供了一些...

  • java unsafe类安全该如何做

    java unsafe类安全该如何做

    Java的Unsafe类是一个非常强大且危险的工具,因为它提供了对内存和系统资源的不受限制的访问。使用Unsafe类可以导致未定义的行为,甚至可能导致程序崩溃。因此,...

  • java unsafe类能修改静态吗

    java unsafe类能修改静态吗

    是的,Java中的Unsafe类可以修改静态字段。Unsafe类提供了一些底层操作,允许你直接访问和修改内存中的数据。但是,使用Unsafe类需要谨慎,因为它可能导致不安全...

  • java 新建线程能处理线程调度吗

    java 新建线程能处理线程调度吗

    是的,Java中新建的线程可以处理线程调度。当你创建一个新的线程时,你需要提供一个实现了Runnable接口或继承了Thread类的类。这个类可以包含你想要在新线程中执...

  • java 新建线程如何处理线程同步

    java 新建线程如何处理线程同步

    在 Java 中,当您创建一个新线程时,可能会遇到线程同步问题。为了避免这些问题,您可以使用以下方法来处理线程同步: 使用 synchronized 关键字: 在需要同步的...

  • java settimeout 怎处理任务取消

    java settimeout 怎处理任务取消

    在Java中,setTimeout通常用于在指定的时间后执行一个任务。然而,Java没有内置的setTimeout函数,但你可以使用ScheduledExecutorService来实现类似的功能。要取...

  • java settimeout 怎处理回调函数

    java settimeout 怎处理回调函数

    在Java中,setTimeout通常用于设置一个定时器,当指定的时间过去后,会执行一个回调函数。但是,Java并没有内置的setTimeout函数,你需要使用ScheduledExecutorS...