Java四个线程常用函数超全使用详解
在Java多线程编程中,有四个常用的线程函数:wait(), notify(), notifyAll()和sleep()。这些函数被广泛使用,并涉及到线程同步、线程等待和线程唤醒等方面。在本篇文章中,我们将深入探讨这些函数的功能以及使用方法。
wait()
wait()函数使当前线程进入等待状态,直到另一个线程调用notify()或notifyAll()函数唤醒它。这个函数必须在同步代码块中调用。
synchronized(obj) {
while(/* some condition */) {
obj.wait();
}
// do something
}
在上面的代码中,在某些条件下,wait()使当前线程等待,并释放obj的锁。这样,其他线程就可以获得这个锁,执行他们的任务。当另一个线程调用obj.notify()或obj.notifyAll()时,当前线程被唤醒,并重新获得锁。
notify()
notify()函数唤醒在obj的等待队列中的任何一个线程。如果有多个线程等待,哪个线程被唤醒是不确定的。
下面是一个简单的示例,演示了如何使用wait()和notify()唤醒线程:
class MyThread implements Runnable {
String threadName;
Thread t;
MyThread(String threadName) {
this.threadName = threadName;
t = new Thread(this, threadName);
System.out.println("New thread: " + t);
t.start();
}
public void run() {
synchronized(this) {
System.out.println(threadName + " is running.");
try {
System.out.println(threadName + " is waiting.");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(threadName + " is awake!");
}
}
}
public class Main {
public static void main(String[] args) {
MyThread t1 = new MyThread("Thread 1");
MyThread t2 = new MyThread("Thread 2");
MyThread t3 = new MyThread("Thread 3");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(t1) {
System.out.println("Notifying thread 1.");
t1.notify();
}
}
}
在这个例子中,三个线程t1,t2和t3都在wait()函数中等待。然后,主线程等待3秒后,唤醒t1线程,t1被唤醒,继续执行run()方法。
notifyAll()
与notify()函数不同,notifyAll()函数唤醒在obj等待队列中的所有线程。下面是一个示例:
class MyThread implements Runnable {
String threadName;
Thread t;
MyThread(String threadName) {
this.threadName = threadName;
t = new Thread(this, threadName);
System.out.println("New thread: " + t);
t.start();
}
public void run() {
synchronized(this) {
System.out.println(threadName + " is running.");
try {
System.out.println(threadName + " is waiting.");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(threadName + " is awake!");
}
}
}
public class Main {
public static void main(String[] args) {
MyThread t1 = new MyThread("Thread 1");
MyThread t2 = new MyThread("Thread 2");
MyThread t3 = new MyThread("Thread 3");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(t1) {
System.out.println("Notifying all threads.");
t1.notifyAll();
}
}
}
在这个例子中,三个线程t1,t2和t3都在wait()函数中等待。然后,主线程等待3秒后,唤醒所有等待中的线程。
sleep()
sleep()函数使当前线程休眠一段时间。这个函数很常用,特别是在模拟收发包的过程中。
下面是一个简单的示例:
public class Main {
public static void main(String[] args) {
System.out.println("Countdown begins.");
for (int i = 10; i >= 0; i--) {
System.out.println("Countdown: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Boom!");
}
}
在这个例子中,主线程计数从10开始,然后每隔一秒钟打印一次计数器。在每次休眠期间,可以使用其他线程执行其他任务。
总结
在这篇文章中,我们深入学习了Java四个线程常用函数的功能和用法,并演示了多个示例。使用这些函数可以提高多线程应用程序的可读性和可靠性。确保在正确的地方使用这些函数,以避免死锁和其他类似的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java四个线程常用函数超全使用详解 - Python技术站