21、CycliBarriar 和 CountdownLatch 都是 Java 并发编程中的线程同步工具。 CycliBarrier 用于创建一个计数器,在达到特定数值时将所有线程放在一起,从而等待直到下一个阶段。而 CountdownLatch 则是一种倒计时锁,允许线程等待其他线程执行某个操作后才开始执行。它们的主要区别在于,CountdownLatch 在达到一定阈值时会释放锁并唤醒所有等待的线程,而 CycliBarriar 则不会。
代码示例:
代码语言:javascript复制CycliBarriar barrier = new CycliBarriar();
for (int i = 0; i < 5; i ) {
barrier.await(); // 所有线程等待计数器为 0
}
22、不可变对象是指一旦创建就无法被修改的对象,如 String、Integer、Boolean 等基本类型和一些包装类(如 ArrayList、HashMap 等)。
在写并发应用时,使用不可变对象可以提高性能和避免出现数据竞争的问题。因为如果一个对象被多个线程同时修改,那么就可能会发生数据错乱的情况。因此,使用不可变对象可以保证线程安全。
代码示例:
代码语言:javascript复制// 定义一个不可变对象
final int num = 0;
// 线程 A 修改 num 的值
Thread A = new Thread(() -> {
num ;
});
A.start();
// 线程 B 修改 num 的值
Thread B = new Thread(() -> {
num--;
});
B.start();
// 线程 C 修改 num 的值
Thread C = new Thread(() -> {
num = 0;
});
C.start();
23、上下文切换是指操作系统或硬件将进程或线程从一个状态切换到另一个状态的过程。在多线程中,上下文切换通常指线程从阻塞状态切换到就绪状态或从就绪状态切换到运行状态。
Java 中的线程调度算法有多种,包括先来先服务、最短作业优先、轮转调度等。具体使用哪种算法取决于系统的硬件资源和应用程序的需求。
代码示例:
代码语言:javascript复制Thread[] threads = new Thread[3];
threads[0] = new Thread(() -> {
System.out.println("Thread A is running");
synchronized (this) {
try {
System.out.println("Thread A has waited");
wait();
System.out.println("Thread A has been notified");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
threads[1] = new Thread(() -> {
System.out.println("Thread B is running");
synchronized (this) {
System.out.println("Thread B has waited");
notify();
System.out.println("Thread B has been notified");
}
});
threads[2] = new Thread(() -> {
System.out.println("Thread C is running");
synchronized (this) {
System.out.println("Thread C has waited");
notifyAll();
System.out.println("Thread C has been notified");
}
});
for (Thread thread : threads) {
thread.start();
}
24、线程组是一组相关联的线程的集合,每个线程都可以加入或退出线程组。在 Java 中,我们可以使用 ThreadGroup 类来创建和管理线程组。
代码示例:
代码语言:javascript复制 ThreadGroup group = new ThreadGroup("My Group");
group.setDaemon(true);
Thread t1 = new Thread(() -> {
System.out.println("Thread 1 in the group");
});
Thread t2 = new Thread(() -> {
System.out.println("Thread 2 in the group");
});
Thread t3 = new Thread(() -> {
System.out.println("Thread 3 in the group");
});
group.addThread(t1);
group.addThread(t2);
group.addThread(t3);
for (Thread thread : group.getThreads()) {
thread.start();
}
25、线程组是 Java 中的一种线程管理机制,它可以将一组相关的线程组织起来,方便管理和控制。但是,在实际开发中,不推荐使用线程组,因为它会增加线程之间的耦合度,使得程序更难以维护和调试。
代码示例:
代码语言:javascript复制ThreadGroup group = new ThreadGroup("My Group");
group.setDaemon(true);
Thread t1 = new Thread(() -> {
System.out.println("Thread 1 in the group");
});
Thread t2 = new Thread(() -> {
System.out.println("Thread 2 in the group");
});
Thread t3 = new Thread(() -> {
System.out.println("Thread 3 in the group");
});
group.addThread(t1);
group.addThread(t2);
group.addThread(t3);
for (Thread thread : group.getThreads()) {
thread.start();
}
26、Java 中有多种方式可以实现一个线程,其中最常见的方式是继承 Thread 类。
代码示例:
代码语言:javascript复制public class MyThread extends Thread {
public void run() {
System.out.println("Thread is running");
}
}
MyThread t = new MyThread();
t.start();
27、在 Java 中,可以通过实现 Runnable 接口来创建一个线程。Runnable 接口只包含一个 run() 方法,该方法需要实现具体的业务逻辑。
代码示例:
代码语言:javascript复制public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Thread is running");
}
}
MyRunnable mr = new MyRunnable();
Thread t = new Thread(mr);
t.start();
28、Synchronized 是 Java 中的一种关键字,用于实现线程间的同步和互斥。当一个线程进入 synchronized 块时,它会获得一个锁,其他线程必须等待该线程释放锁之后才能进入 synchronized 块。
代码示例:
代码语言:javascript复制Object lock = new Object();
public void foo() {
synchronized (lock) {
System.out.println("Thread 1 is synchronized on " lock);
}