21.编写一个Java程序,使用多线程实现两个数的同时累加。
在Java中,我们可以使用多线程来实现两个数的同时累加。下面是一个简单的示例,其中创建了两个线程,每个线程负责累加不同的数字。
请注意,此示例假设我们要同时累加两个独立的数字序列,而不是同一个数字序列。如果需要同时累加同一个数字序列,那么需要更多的同步机制来避免数据竞争和不一致。
java复制代码
public class SimultaneousAddition { | |
private static final int NUM_THREADS = 2; | |
private static final int MAX_VALUE = 1000000; // 假设我们要累加的数字范围 | |
private static volatile long sum1 = 0; | |
private static volatile long sum2 = 0; | |
public static void main(String[] args) { | |
Thread thread1 = new Thread(() -> { | |
for (int i = 0; i < MAX_VALUE; i++) { | |
sum1 += i; | |
} | |
}); | |
Thread thread2 = new Thread(() -> { | |
for (int i = MAX_VALUE; i >= 0; i--) { | |
sum2 += i; | |
} | |
}); | |
thread1.start(); | |
thread2.start(); | |
try { | |
thread1.join(); | |
thread2.join(); | |
} catch (InterruptedException e) { | |
e.printStackTrace(); | |
} | |
System.out.println("Sum 1: " + sum1); | |
System.out.println("Sum 2: " + sum2); | |
} | |
} |
在这个程序中,我们创建了两个线程,thread1
和thread2
。thread1
从0开始累加,直到MAX_VALUE
,而thread2
则从MAX_VALUE
开始递减,直到0。我们使用了volatile
关键字来确保sum1
和sum2
的可见性,这样当一个线程修改这些变量的值时,其他线程可以立即看到这些变化。
我们使用join()
方法等待两个线程都完成执行。然后,我们打印出两个线程各自计算出的和。
请注意,这个程序并没有处理可能出现的并发问题,因为sum1
和sum2
的累加操作并不是原子的。在实际情况中,如果需要对共享数据进行复杂的并发操作,你可能需要使用更复杂的同步机制,如synchronized
块、ReentrantLock
或AtomicLong
等。然而,在这个特定的例子中,由于每个线程都在操作自己的独立变量,所以我们不需要额外的同步。