21xrx.com
2024-11-05 14:46:39 Tuesday
登录
文章检索 我的文章 写文章
如何用Java实现多线程有序执行任务
2023-07-07 07:16:00 深夜i     --     --
Java 多线程 有序执行 任务 实现

Java作为一门面向对象的编程语言,天生支持多线程操作,而多线程可以利用CPU的多核进行并行计算,提高程序的效率。

然而,在实际应用中,多线程的执行顺序是十分重要的。例如,在网页抓取程序中,每次抓取的页面内容都需要按照一定的顺序进行处理,否则可能会导致数据丢失或者结果不准确。因此,如何用Java实现多线程有序执行任务,就成为了很多Java开发者关注的问题。

下面就介绍一下Java如何实现多线程有序执行任务:

1. 继承Thread类或实现Runnable接口

在Java中,要实现多线程有序执行任务,首先需要创建线程类。由于Java中没有多继承的特性,这里我们可以使用两种方式实现:

(1)继承Thread类:需要实现run()方法,在该方法中编写需要在线程中执行的代码。

(2)实现Runnable接口:需要实现run()方法,并将该接口实现类传入Thread类的构造器中。

2. 使用同步锁synchronized

Java中提供了synchronized关键字,它可以保证同一时刻只有一个线程可以访问共享资源。例如:


public class SynchronizedThread implements Runnable{

  int i;

  public synchronized void Add(){

   i++;

  }

  public void run(){

   for (int j=1;j<=100;j++){

     Add();

   }

  }

  public static void main(String args[]){

   SynchronizedThread myRunnable = new SynchronizedThread();

   Thread t1=new Thread(myRunnable);

   Thread t2=new Thread(myRunnable);

   t1.start();

   t2.start();

   try {

     t1.join();

     t2.join();

   } catch (InterruptedException e){

     e.printStackTrace();

   }

   System.out.println(myRunnable.i); //输出结果为200

  }

}

3. 使用wait和notifyAll实现线程间的协作

wait和notifyAll是Java提供的线程协作API,它们可以让线程进入等待状态或唤醒等待中的线程。例如:


public class WaitNotifyThread {

  public static void main(String args[]){

   Object o = new Object();

   Thread t1=new Thread(new Runnable(){

     public void run(){

      for (int i=1;i<=10;i++){

        synchronized(o){

         System.out.println("线程1执行了第"+i+"次");

         o.notifyAll(); //唤醒其它线程

         try {

           o.wait(); //释放锁并等待

         } catch (InterruptedException e){

           e.printStackTrace();

         }

        }

      }

     }

   });

   Thread t2=new Thread(new Runnable(){

     public void run(){

      for (int i=1;i<=10;i++){

        synchronized(o){

         System.out.println("线程2执行了第"+i+"次");

         o.notifyAll(); //唤醒其它线程

         try {

           o.wait(); //释放锁并等待

         } catch (InterruptedException e){

           e.printStackTrace();

         }

        }

      }

     }

   });

   t1.start();

   t2.start();

  }

}

在以上示例代码中,t1和t2两个线程交替执行,并向控制台输出当前执行的次数,每一次输出之后,都会唤醒其它处于等待状态的线程并释放锁,然后自己进入等待状态。

综上所述,比较常用的Java多线程有序执行任务的方式有以上三种,开发者可根据实际需求灵活选择。最后提醒,要注意线程安全问题,避免多线程并发导致的数据不一致等异常情况的发生。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复