Java线程三要素

在Java中,线程是实现并发编程的一种重要手段。了解和掌握线程的基本概念和相关知识,对于开发高效、可靠的多线程程序至关重要。本文将介绍Java线程的三个重要要素,即线程的创建、线程的调度和线程的同步,并给出相应的代码示例。

线程的创建

在Java中,线程的创建有两种方式,一种是通过继承Thread类,另一种是通过实现Runnable接口。下面分别给出两种方式的示例代码。

通过继承Thread类创建线程

class MyThread extends Thread {
    @Override
    public void run() {
        // 线程执行的代码
        for (int i = 0; i < 10; i++) {
            System.out.println("Thread " + Thread.currentThread().getId() + ": " + i);
        }
    }
}

public class ThreadCreationExample {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        
        thread1.start();
        thread2.start();
    }
}

上述代码中,通过继承Thread类创建了一个自定义的线程类MyThread。在MyThread类中,重写了run()方法,定义了线程的执行逻辑。在main()方法中,创建了两个MyThread对象,并分别调用start()方法启动线程。

通过实现Runnable接口创建线程

class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程执行的代码
        for (int i = 0; i < 10; i++) {
            System.out.println("Thread " + Thread.currentThread().getId() + ": " + i);
        }
    }
}

public class ThreadCreationExample {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        
        Thread thread1 = new Thread(runnable);
        Thread thread2 = new Thread(runnable);
        
        thread1.start();
        thread2.start();
    }
}

上述代码中,通过实现Runnable接口创建了一个自定义的线程类MyRunnable。在MyRunnable类中,同样重写了run()方法。在main()方法中,首先创建了一个MyRunnable对象runnable,然后通过传入runnable对象创建了两个Thread对象thread1thread2,最后调用start()方法启动线程。

通过继承Thread类创建线程的方式较为简单,但由于Java是单继承的,这种方式不适合需要继承其他类的情况。因此,一般推荐使用通过实现Runnable接口创建线程的方式。

线程的调度

Java线程的调度由操作系统完成,程序员无法直接控制。但可以通过线程优先级和线程休眠等手段来影响线程的调度顺序。

线程优先级

线程的优先级用整数表示,范围是1到10。默认情况下,一个线程的优先级与创建它的父线程的优先级相同。可以通过setPriority(int priority)方法设置线程的优先级。

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("Thread " + Thread.currentThread().getId() + ": " + i);
        }
    }
}

public class ThreadPriorityExample {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        
        thread1.setPriority(Thread.MIN_PRIORITY); // 设置线程1的优先级为最低
        thread2.setPriority(Thread.MAX_PRIORITY); // 设置线程2的优先级为最高
        
        thread1.start();
        thread2.start();
    }
}

上述代码中,通过setPriority()方法设置了线程1的优先级为最低,线程2的优先级为最高。由于线程的调度由操作系统完成,不同的操作系统可能会有不同的调度策略,因此设置线程的优先级并不能完全保证线程的执行顺序。

线程休眠