一、实验目的和要求
1.实验目的
通过实验,熟掌握java语言程序设计的基本方法。
掌握多线程编程的特点;了解线程的调度和执行过程;掌握资源共享访问的实现方法。
2.实验内容
使用两个线程同时对计数器加1操作,求出结果
二、源代码
public class MultiThreadDemo {
public static void main(String[] args) {
Counter counter = new Counter();
// 创建两个线程分别对计数器进行加1操作
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
counter.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
counter.increment();
}
});
// 启动两个线程
t1.start();
t2.start();
// 等待两个线程结束
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 打印出最终计数器的值
System.out.println("Counter value: " + counter.getCount());
}
// 计数器类,实现了资源共享访问的方式
public static class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
}
三、运行结果
Counter value: 20000
四、心得体会
本人对多线程的知识点的掌握度一直处于一般状态,所以选择了一个比较初级的实验项目。
本实验中,我的实验思路是:创建一个计数器类Counter,其中包含了一个整型变量count,用于记录计数器的值。为了实现资源的共享访问,在increment()方法上加了synchronized关键字,使得在同一时刻只有一个线程能够访问该方法。在main()函数中,创建了两个线程t1和t2,并分别让它们对计数器进行10000次加1操作。为了让两个线程可以并发执行,我使用了多线程编程的特点,即通过创建多个线程来并行执行任务。使用匿名内部类的方式来创建线程,并在其中实现了对计数器的加1操作。在启动两个线程之后,使用t1.join()和t2.join()方法来等待两个线程执行结束。这是为了保证在计算最终的计数器值时,两个线程已经完成了所有的加1操作。最后,打印出最终的计数器值,可以看到它的值为20000,说明两个线程对计数器进行了并发的加1操作,且通过synchronized关键字实现了对计数器的线程安全访问。
我认为,这个程序虽然不算难,但展示了多线程编程的特点、线程的调度和执行过程,以及资源共享访问的实现方式。在这项实验中,我切实地感受到java程序语言在实际开发中,可以根据具体的需求和场景,灵活运用多线程编程来提高程序的性能和效率。
在此实验中,我有去请教学姐学姐,他们给予了我许多宝贵的意见。总的来说,编写多线程程序需要掌握一定的理论知识和实践经验,需要仔细思考和设计程序的架构和实现方式,同时需要注意代码的正确性、健壮性和性能。对于我们这种初学者来说,需要通过学习相关的书籍、课程和实践经验来提高自己的多线程编程能力。