欢迎访问宙启技术站
智能推送

Java多线程函数使用实战:线程并发处理的常用函数举例

发布时间:2023-06-23 07:12:45

多线程技术在现代编程中已经得到广泛应用,它可以大大提高程序的运行效率,提高系统性能和响应速度。而在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多线程编程常用的几个函数。掌握这些函数,可以极大的提高程序的效率和实现线程并发处理的能力