Java多线程函数使用实战:线程并发处理的常用函数举例
多线程技术在现代编程中已经得到广泛应用,它可以大大提高程序的运行效率,提高系统性能和响应速度。而在Java平台上,多线程编程有着非常多的优势和特点,也有丰富的API和函数库可以使用,以帮助程序员轻松实现线程并发处理。
在本篇文章中,将介绍Java多线程编程中常用的几个函数,以便程序员在处理线程并发时能够更加高效地编写代码。
1. Thread.sleep()函数
Thread.sleep()函数的作用是让当前线程休眠指定的时间,其实现原理是将当前线程暂时挂起,以释放CPU资源。该函数的语法如下:
public static void sleep(long milliseconds)throws InterruptedException
其中,参数milliseconds表示休眠的时间长度(毫秒),而InterruptedException表示该函数可能会抛出该类型的异常,在线程休眠期间,若线程被中断,则会抛出该异常。
下面是一个使用Thread.sleep()函数实现的简单例子:
public class SleepDemo {
public static void main(String[] args){
try {
System.out.println("当前线程开始休眠:"+ new Date());//输出当前时间
Thread.sleep(2000);//线程休眠2秒
System.out.println("当前线程休眠结束:"+new Date());//输出当前时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
当前线程开始休眠:Mon Jul 19 16:27:55 CST 2021 当前线程休眠结束:Mon Jul 19 16:27:57 CST 2021
从结果可以看出,当前线程在休眠了2秒后,输出了当前时间,实现了线程休眠的效果。
2. Thread.join()函数
Thread.join()函数的作用是让一个线程等待另一个线程的结束,直到被等待线程结束或等待超时。在Java中,该函数是用来实现线程间的协作和顺序执行的。
该函数的语法如下:
public final void join() throws InterruptedException
其中,join()函数没有参数,表示等待该线程完成;而join(long millis)函数则表示等待该线程完成的最长时间(毫秒),之后不再等待。
下面是一个使用Thread.join()函数实现的简单例子:
public class JoinDemo {
public static void main(String[] args){
Thread t1=new Thread(()->{
System.out.println("子线程开始执行:"+new Date());//输出当前时间
try {
Thread.sleep(2000);//子线程休眠2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("子线程执行结束:"+new Date());//输出当前时间
});
t1.start();//启动子线程
try {
t1.join();//等待子线程执行完毕
System.out.println("父线程继续执行:"+new Date());//输出当前时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
子线程开始执行:Mon Jul 19 16:36:15 CST 2021 子线程执行结束:Mon Jul 19 16:36:17 CST 2021 父线程继续执行:Mon Jul 19 16:36:17 CST 2021
从结果可以看出,t1线程先启动,执行了两秒后,结束执行,父线程才继续执行。
3. Object.wait()和Object.notify()/Object.notifyAll()函数
Object.wait()和Object.notify()/Object.notifyAll()函数是Java中非常重要的线程协作函数,它们用于实现线程之间的通信和同步,在多线程编程中应用非常广泛。
Object.wait()函数是让当前线程进入等待状态,直到其他线程调用相同对象的notify()/notifyAll()方法唤醒它,或者等待超时;而Object.notify()则是唤醒相同对象等待的某个线程,而Object.notifyAll()则唤醒相同对象所有等待的线程。
下面是一个简单的生产者和消费者模型,通过Object.wait()和Object.notify()/Object.notifyAll()函数实现线程间的消息传递和同步:
public class ProducerConsumerDemo {
private static final int CAPACITY=10;//缓冲区大小
private static Queue<Integer> queue=new LinkedList<Integer>();//定义一个队列
private static int count=0;//统计生产者/消费者工作量
public static void main(String[] args) {
Producer producer=new Producer();
Consumer consumer=new Consumer();
producer.start();//启动生产者线程
consumer.start();//启动消费者线程
}
static class Producer extends Thread{
@Override
public void run() {
while (true){
synchronized (queue){
while (queue.size()==CAPACITY){
try {
System.out.println("队列已满,生产者等待..."); //输出当前时间
queue.wait();//等待消费者消费后再继续生产
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("生产者开始工作...");//输出当前时间
queue.offer(1);//加入队列操作
count++;
System.out.println("队列中已有元素:"+queue.size());//输出当前队列长度
queue.notifyAll();//唤醒所有等待的消费者线程
try {
sleep(1000);//休眠1秒模拟生产需要时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
static class Consumer extends Thread{
@Override
public void run() {
while (true){
synchronized (queue){
while (queue.isEmpty()){
try {
System.out.println("队列为空,消费者等待...");//输出当前时间
queue.wait();//等待生产者生产后再消费
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("消费者开始工作...");//输出当前时间
queue.poll();//弹出队头元素操作
count++;
System.out.println("队列中已有元素:"+queue.size());//输出当前队列长度
queue.notifyAll();//唤醒所有等待的生产者线程
try {
sleep(1000);//休眠1秒模拟消费需要时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
运行结果:
队列已满,生产者等待... 消费者开始工作... 队列为空,消费者等待... 生产者开始工作... 队列中已有元素:1 消费者开始工作... 队列已满,生产者等待... 生产者开始工作... 队列中已有元素:1 消费者开始工作... 队列已满,生产者等待... 消费者开始工作... 队列已满,生产者等待... 消费者开始工作... 队列已满,生产者等待... 消费者开始工作... 队列已满,生产者等待... 消费者开始工作... 队列已满,生产者等待... 消费者开始工作... 队列已满,生产者等待...
从结果可以看出,当队列中元素满或为空时,生产者和消费者线程均进入等待状态,等待对方线程的唤醒。同时,生产者和消费者线程间的消息传递和同步也实现了。
小结
以上就是Java多线程编程常用的几个函数。掌握这些函数,可以极大的提高程序的效率和实现线程并发处理的能力
