Java多线程编程中的常用函数及使用方式
发布时间:2023-06-19 11:00:12
Java多线程编程是非常常见的技术,在Java语言中提供了丰富的函数和类库,方便我们进行多线程编程。下面我们就来介绍一些Java多线程编程中常用的函数及使用方式。
1. Thread.sleep(long millis)
这个函数可以让当前线程暂停执行指定的时间,单位是毫秒。这个函数常用于模拟一些时间延迟,或者让线程暂停一段时间再执行下一个任务。
使用方式:
try {
Thread.sleep(1000); //线程暂停1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
2. Thread.yield()
这个函数可以让当前线程放弃CPU执行时间,让其他线程执行。这个函数常用于协调多个线程的执行顺序,避免某个线程一直占用CPU资源。
使用方式:
Thread.yield(); //线程放弃CPU执行时间
3. Thread.join()
这个函数可以让一个线程等待其他线程执行完毕再继续执行。这个函数常用于协调多个线程的执行顺序,保证子线程完成后再执行主线程。
使用方式:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//执行子线程任务
}
});
thread.start(); //启动子线程
try {
thread.join(); //等待子线程执行完毕
} catch (InterruptedException e) {
e.printStackTrace();
}
4. wait()、notify()、notifyAll()
这三个函数常用于线程间的协作操作,wait()可以让线程进入等待状态,只有当其他线程调用notify()或notifyAll()才能让该线程继续执行。notify()和notifyAll()分别用于唤醒一个或多个处于等待状态的线程。
使用方式:
public class LockTest {
private boolean flag = true;
public synchronized void methodA() {
while (flag) {
try {
wait(); //线程进入等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("methodA");
flag = true;
notifyAll(); //唤醒处于等待状态的线程
}
public synchronized void methodB() {
while (!flag) {
try {
wait(); //线程进入等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("methodB");
flag = false;
notifyAll(); //唤醒处于等待状态的线程
}
}
LockTest lockTest = new LockTest();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
lockTest.methodA();
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
lockTest.methodB();
}
});
thread1.start();
thread2.start();
上面的代码演示了使用wait()、notify()、notifyAll()实现线程间的协作操作。
5. ThreadLocal类
ThreadLocal类可以让每个线程拥有自己的变量副本,避免不同线程之间的变量互相干扰。这个类常用于实现线程安全的代码。
使用方式:
public class Counter {
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return 0; //初始化一个值
}
};
public void increment() {
int count = threadLocal.get(); //获取当前线程的变量副本
count++;
threadLocal.set(count); //保存当前线程的变量副本
}
public int getCount() {
return threadLocal.get(); //获取当前线程的变量副本
}
}
Counter counter = new Counter();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
counter.increment();
System.out.println("Thread1 count: " + counter.getCount());
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
counter.increment();
System.out.println("Thread2 count: " + counter.getCount());
}
}
});
thread1.start();
thread2.start();
上面的代码演示了使用ThreadLocal类实现线程安全的计数器。
以上就是Java多线程编程中常用的函数及使用方式。在实际编程中,我们还可以使用Java并发包中的类库来实现更为复杂的多线程编程,比如线程池、锁机制、原子变量等。
