21xrx.com
2024-05-20 19:51:31 Monday
登录
文章检索 我的文章 写文章
Java多线程并发实例:代码编写教程
2023-06-29 22:49:33 深夜i     --     --
Java 多线程 并发 实例 代码编写

Java多线程并发是开发中经常会用到的技术,它可以提高程序的并发性能,同时也可以更好地利用计算资源。本文将介绍Java多线程并发实例,为大家提供代码编写教程。

1. 创建线程

Java中创建线程的方式有两种,一种是继承Thread类,另一种是实现Runnable接口。我们先来看继承Thread类的方式。


public class MyThread extends Thread {

  public void run()

    //线程执行体

  

}

通过继承Thread类,我们需要重写该类的run()方法,该方法中定义了线程的执行逻辑。

创建Thread对象并启动线程的方法如下:


MyThread myThread = new MyThread();

myThread.start();

这样就创建了一个线程,并启动了该线程。

2. 实现Runnable接口

下面是实现Runnable接口的示例代码。


public class MyRunnable implements Runnable {

  @Override

  public void run()

    //线程执行体

  

}

为了启动线程,我们需要将实现了Runnable接口的类实例化,并将其传递给Thread类的构造方法,最后调用start()方法启动线程。


MyRunnable mr = new MyRunnable();

Thread thread = new Thread(mr);

thread.start();

3. 线程间的通信

线程间的通信是多线程编程中一个非常重要的方面。Java中提供了wait()、notify()、notifyAll()等方法来实现线程间的通信。


public class Producer implements Runnable {

  private Stack stack;

  public Producer(Stack stack)

    this.stack = stack;

  

  public void run() {

    while (true) {

      synchronized (stack) {

        if (stack.isFull()) {

          try {

            stack.wait();

          } catch (InterruptedException e) {

            e.printStackTrace();

          }

        }

        stack.push(new Object());

        System.out.println("Producer: " + stack.getSize());

        stack.notifyAll();

      }

    }

  }

}

public class Consumer implements Runnable {

  private Stack stack;

  public Consumer(Stack stack)

    this.stack = stack;

  

  public void run() {

    while (true) {

      synchronized (stack) {

        if (stack.isEmpty()) {

          try {

            stack.wait();

          } catch (InterruptedException e) {

            e.printStackTrace();

          }

        }

        stack.pop();

        System.out.println("Consumer: " + stack.getSize());

        stack.notifyAll();

      }

    }

  }

}

上面的代码实现了一个简单的生产者消费者模式。在生产者和消费者之间,需要一种机制来协调它们之间的工作。在本例中,Stack类提供了一个栈,生产者会将数据压入栈中,而消费者则会从中弹出数据。当栈满的时候,生产者将会进入等待状态,并释放持有的锁。待其他线程调用了栈的pop()方法之后,生产者会被唤醒,并重新竞争锁,并进行下一轮的生产。

4. 线程池

线程池是一种非常实用的并发编程技术,在Java中也提供了ThreadPoolExecutor类来实现线程池功能。


ExecutorService pool = Executors.newFixedThreadPool(5);

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

  pool.execute(new MyTask(i));

}

pool.shutdown();

上面的代码中,我们使用Executors类的静态工厂方法newFixedThreadPool(5)来创建一个固定线程数的线程池,并向其中提交了10个任务。最后调用了pool.shutdown()方法来关闭线程池。

5. 锁

Java中提供了很多种锁,其中最常见的是synchronized关键字和ReentrantLock类。


synchronized (lock)

  //同步代码块

上面的代码使用了synchronized关键字来获取一个锁并执行同步代码块。在同步代码块中可以访问共享资源,并确保资源在并发访问中的数据一致性。


ReentrantLock lock = new ReentrantLock();

lock.lock();

try

  //同步代码块

finally {

  lock.unlock();

}

ReentrantLock类通过lock()方法获取锁,unlock()方法释放锁。使用该类需要注意在获取锁的时候,如果锁被其他线程占用,则会进入等待状态。

本文介绍了Java多线程并发实例的代码编写教程,包括了创建线程、线程间的通信、线程池和锁等方面。通过本文的学习,我们可以更加深入地了解Java并发编程的具体实现方法,并更好地应用于实际开发中。

  
  

评论区

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