21xrx.com
2025-04-03 21:02:49 Thursday
文章检索 我的文章 写文章
Java多线程并发实例:代码编写教程
2023-06-29 22:49:33 深夜i     15     0
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并发编程的具体实现方法,并更好地应用于实际开发中。

  
  

评论区