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;
}
}
