📜  Java中的多线程(1)

📅  最后修改于: 2023-12-03 15:16:32.119000             🧑  作者: Mango

Java中的多线程

Java是一种支持多线程编程的语言。多线程是指在同一时间内,程序中不同的部分可以并行执行。这使得Java程序可以更加高效地利用CPU资源,从而提高程序的执行效率。

创建线程的方式

Java中创建线程有两种方式:继承Thread类或实现Runnable接口。

继承Thread类

创建一个线程类,通过继承Thread类并重写run()方法来实现:

public class MyThread extends Thread {
    public void run() {
        // 线程执行代码
    }

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

当调用start()方法时,会启动一个新的线程执行run()方法中的代码。

实现Runnable接口

创建一个线程类,实现Runnable接口并重写run()方法来实现:

public class MyRunnable implements Runnable {
    public void run() {
        // 线程执行代码
    }

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

当调用start()方法时,会启动一个新的线程执行Runnable接口实现类中的run()方法。

线程的状态

Java中的线程具有以下五种状态:

  1. New:创建一个新线程时处于该状态。
  2. Runnable:调用start()方法后处于该状态,等待CPU资源。
  3. Blocked:线程因为某些原因被阻塞。
  4. Waiting:等待其他线程执行一些操作,如join()方法和wait()方法。
  5. Terminated:run()方法执行完毕并且该线程已经停止。
互斥锁和同步锁

Java中的互斥锁和同步锁用于控制线程的访问和修改共享变量。互斥锁是指同一时间只能有一个线程访问共享资源,多个线程需要等待互斥锁释放后才能进行访问。同步锁是指同一时间只能有一个线程访问共享资源,但是多个线程可以同时获得同步锁,只有获得同步锁的线程才能访问共享资源。

Java中使用synchronized关键字实现互斥锁和同步锁:

public class MyRunnable implements Runnable {
    private int count = 0;

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

    public void run() {
        for (int i = 0; i < 100000; i++) {
            increment();
        }
    }

    public static void main(String[] args) {
        MyRunnable mr = new MyRunnable();
        Thread t1 = new Thread(mr);
        Thread t2 = new Thread(mr);
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(mr.count);
    }
}

synchronized关键字修饰的方法或代码块中,同一时间只能有一个线程访问共享资源,从而避免了资源竞争和线程安全问题。

线程池

Java中提供了线程池机制,可以更加有效地管理和控制多个线程的执行。线程池可以避免频繁地创建和销毁线程,从而提高程序的执行效率。

public class MyRunnable implements Runnable {
    public void run() {
        // 线程执行代码
    }

    public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
            Runnable r = new MyRunnable();
            pool.execute(r);
        }
        pool.shutdown();
    }
}

使用Executors.newFixedThreadPool()方法创建一个容量为5的线程池,使用pool.execute()方法提交任务,线程池会自动管理线程的创建和销毁。pool.shutdown()方法用于关闭线程池。

总结

Java中的多线程是一种强大的编程工具,可以提高程序对CPU资源的利用率和应用程序的响应性能。程序员可以通过创建线程的方式和锁机制实现多线程编程。同时,利用线程池机制也可以更加有效地管理和控制多线程的执行,提高程序的执行效率。