欢迎访问宙启技术站
智能推送

Java中如何操作多线程函数?

发布时间:2023-06-19 16:33:18

在 Java 中,多线程是通过创建 Thread 对象并启动运行来实现的。多线程函数主要涉及线程的创建、启动、休眠、唤醒、等待、加锁、解锁等操作。

1. 创建线程

Java 中创建线程的两种方式:

(1)继承 Thread 类并覆盖 run() 方法;

(2)实现 Runnable 接口并实现 run() 方法。

// 继承 Thread 类 
class MyThread extends Thread {
    public void run() {
        // 线程执行的内容
    }
}
MyThread thread = new MyThread();

// 实现 Runnable 接口
class MyRunnable implements Runnable {
    public void run() {
        // 线程执行的内容
    }
}
Thread thread = new Thread(new MyRunnable());

2. 启动线程

启动线程需要调用线程对象的 start() 方法,启动的线程会运行 run() 方法中的代码。

thread.start();

3. 休眠线程

线程休眠可以用 Thread 类的 sleep() 方法。它会让当前线程睡眠指定的时间,然后再继续运行。

try {
    Thread.sleep(5000); // 休眠 5 秒
} catch(InterruptedException e) {
    e.printStackTrace();
}

4. 唤醒线程

线程唤醒可以用 Object 类的 wait() 和 notify() 方法。wait() 方法会让当前线程等待,直到其他线程调用该对象的 notify() 方法才能继续执行。

public synchronized void setMessage(String message) {
    this.message = message;
    notify();
}
public synchronized String getMessage() {
    while (message == null) {
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    return message;
}

5. 线程等待

线程等待可以用 Thread 类的 join() 方法。它会使主线程等待该线程执行完毕再执行。

try {
    thread.join(); // 等待 thread 线程执行完毕
} catch (InterruptedException e) {
    e.printStackTrace();
}

6. 加锁

Java 中线程安全主要是通过加锁来实现。加锁可以用 synchronized 关键字和 ReentrantLock 类。

(1)synchronized 关键字

synchronized 关键字可以用来修饰方法和代码块。用来修饰方法会锁定整个方法,用来修饰代码块可以指定锁定的对象。

public synchronized void add(int num) {
    count += num;
}

private final Object lock = new Object();
public void add(int num) {
    synchronized(lock) {
        count += num;
    }
}

(2)ReentrantLock 类

ReentrantLock 类提供了更加灵活的锁定方式。可以指定锁定的公平性和可重入性。

ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
    // 需要锁定的代码
} finally {
    lock.unlock();
}

7. 解锁

解锁与加锁相对应,可以用 synchronized 关键字和 ReentrantLock 类的 unlock() 方法。

public synchronized void add(int num) {
    count += num;
}

private final Object lock = new Object();
public void add(int num) {
    synchronized(lock) {
        count += num;
    }
}