Java多线程编程实战

引言

Java是一种面向对象的编程语言,具有跨平台的特性和良好的可扩展性。在Java中,多线程编程是一种常见的技术,允许程序同时执行多个任务,提高程序的性能和效率。本文将介绍Java多线程编程的基本概念和常用技巧,并通过代码示例来演示其使用。

什么是线程?

在计算机中,线程是程序执行的最小单位,也是进程的一部分。一个进程可以包含多个线程,这些线程可以并发执行,共享进程的资源,但每个线程有自己的栈空间和程序计数器。线程之间的切换是由操作系统负责调度的,因此在多线程编程中需要注意资源竞争和同步问题。

创建线程

在Java中,创建线程有两种常用的方法:继承Thread类和实现Runnable接口。下面分别介绍这两种方法的使用。

继承Thread类

继承Thread类是创建线程的一种简单方式。首先,我们需要创建一个继承自Thread的子类,并重写其run方法。在run方法中编写线程的业务逻辑。下面是一个简单的示例:

public class MyThread extends Thread {
    @Override
    public void run() {
        // 线程的业务逻辑
        for (int i = 0; i < 10; i++) {
            System.out.println("Thread: " + i);
        }
    }

    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}

在上面的示例中,我们创建了一个名为MyThread的子类,并重写了其run方法。在main方法中创建了一个MyThread的实例,并通过调用start方法来启动线程。线程启动后,会自动调用其run方法执行线程的业务逻辑。

实现Runnable接口

实现Runnable接口是另一种创建线程的方式。首先,我们需要创建一个实现了Runnable接口的类,并实现其run方法。然后,创建Thread对象,将实现了Runnable接口的类的对象作为参数传递给Thread对象的构造函数。最后,通过调用Thread对象的start方法来启动线程。下面是一个示例:

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程的业务逻辑
        for (int i = 0; i < 10; i++) {
            System.out.println("Thread: " + i);
        }
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }
}

在上面的示例中,我们创建了一个名为MyRunnable的类,并实现了Runnable接口的run方法。在main方法中创建了一个Thread对象,并将MyRunnable的对象作为参数传递给Thread对象的构造函数。通过调用Thread对象的start方法来启动线程。

线程间的通信

在线程编程中,线程之间经常需要进行通信,以实现数据的共享和交换。Java提供了多种方式来实现线程间的通信,例如使用共享变量、使用wait和notify方法、使用阻塞队列等。

使用共享变量

共享变量是多个线程可以访问的变量。在Java中,我们可以使用synchronized关键字来实现对共享变量的同步访问。下面是一个示例:

public class SharedVariable {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }

    public static void main(String[] args) throws InterruptedException {
        SharedVariable sharedVariable = new SharedVariable();

        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                sharedVariable.increment();
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                sharedVariable.increment();
            }
        });

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println("Count