自学内容网 自学内容网

线程的概述

    Thread 是 Java 中用于实现多线程的一种机制,它是一个轻量级的进程,可以让程序并发地执行多个任务。在 Java 中,Thread 类代表了一个线程,线程是程序执行的基本单元。通过多线程,可以提高程序的效率,特别是在涉及到大量 I/O 操作或 CPU 密集型计算的场景下。

一、创建线程的两种常见方式

1. 继承 Thread

        你可以通过继承 Thread 类并重写它的 run() 方法来创建一个线程。run() 方法定义了线程执行的任务。

示例:

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("线程 " + Thread.currentThread().getName() + " 正在执行任务");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        
        thread1.start();  // 启动线程1
        thread2.start();  // 启动线程2
    }
}

解析:

  • MyThread 类继承自 Thread 类,重写了 run() 方法,定义了线程的任务。
  • 调用 start() 方法启动线程,底层会调用 run() 方法执行线程任务。
  • Thread.currentThread().getName() 用来获取当前线程的名字,默认为“main”线程或线程池的线程名。

2. 实现 Runnable 接口

        另一种创建线程的方式是实现 Runnable 接口,Runnable 接口只定义了一个 run() 方法,不包含线程的控制逻辑。实现 Runnable 接口后,可以将其传递给 Thread 对象的构造函数来创建线程。

示例:

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("线程 " + Thread.currentThread().getName() + " 正在执行任务");
    }
}

public class Main {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        
        Thread thread1 = new Thread(myRunnable);
        Thread thread2 = new Thread(myRunnable);
        
        thread1.start();  // 启动线程1
        thread2.start();  // 启动线程2
    }
}

解析:

  • MyRunnable 类实现了 Runnable 接口,并重写了 run() 方法。
  • 创建了两个 Thread 对象,并将 MyRunnable 实例传递给 Thread 的构造函数。
  • 调用 start() 启动线程,线程执行 run() 方法。

二、线程的生命周期

线程的生命周期包括以下几个阶段:

  1. 新建(New):线程对象被创建但尚未调用 start() 方法时处于此状态。
  2. 就绪(Runnable):线程调用了 start() 方法,线程进入就绪状态,等待系统调度器分配 CPU 时间片。
  3. 运行(Running):线程被调度器分配到 CPU 时间片后,线程进入运行状态,执行 run() 方法中的任务。
  4. 阻塞(Blocked):线程因为某些条件(例如等待锁、I/O 操作)无法继续执行,进入阻塞状态。
  5. 死亡(Dead):线程执行完 run() 方法后,线程生命周期结束,进入死亡状态。

三、线程同步

        在多线程环境中,多个线程可能会同时访问共享资源,这时候可能会产生竞争条件,导致程序出现错误。为了防止这种情况,需要对共享资源进行同步。

示例:

class Counter {
    private int count = 0;
    
    public synchronized void increment() {
        count++;
    }
    
    public int getCount() {
        return count;
    }
}

public class Main {
    public static void main(String[] args) {
        Counter counter = new Counter();
        
        // 创建多个线程并执行任务
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });
        
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });
        
        thread1.start();
        thread2.start();
        
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("最终计数值:" + counter.getCount());
    }
}

解析:

  • increment() 方法使用了 synchronized 关键字,确保了在同一时刻只有一个线程能进入该方法,从而避免了多个线程同时修改 count 变量的竞争条件。
  • thread1.join()thread2.join() 确保主线程等待 thread1thread2 执行完成后再输出结果。

四、线程的优先级

        每个线程都可以设置优先级,优先级的范围是从 Thread.MIN_PRIORITY(1)到 Thread.MAX_PRIORITY(10)。线程调度器会尽量优先调度优先级高的线程。

示例:

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 执行");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        
        thread1.setPriority(Thread.MAX_PRIORITY);
        thread2.setPriority(Thread.MIN_PRIORITY);
        
        thread1.start();
        thread2.start();
    }
}

解析:

  • setPriority() 方法用于设置线程的优先级。
  • 线程的调度是由操作系统决定的,设置线程优先级可以影响线程的调度顺序,但并不保证会按优先级执行。

五、总结

    Thread 类是 Java 中实现并发编程的核心,通过创建多个线程可以实现任务的并发执行。我们可以通过继承 Thread 类或实现 Runnable 接口来创建线程。多线程的同步机制(如 synchronized)确保了共享资源的安全性。线程的优先级可以通过 setPriority() 方法进行调整,但最终的调度还是由操作系统来决定。


原文地址:https://blog.csdn.net/2401_83418369/article/details/143863531

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!