-
Java多线程微压力测试(中途遇到鬼了)10
如题求解public class ThreadTest { public static void main(String[] args) throws InterruptedException { new Monitor().start(); new MyThread().launch(); } } class MyThread extends Thread { //被争抢资源 public static Integer i = 0; //线程容器 public static List<MyThread> list = new ArrayList<MyThread>(); //启动50个线程 public void launch() { for (int i = 0; i < 50; i++) { MyThread temThread = new MyThread(); list.add(temThread); temThread.start(); } } @Override public void run() { synchronized (MyThread.i) { try { //增大争抢强度 Thread.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } //主要的任务 MyThread.i++; } } } class Monitor extends Thread { public int n = 0; @Override public void run() { while (true) { try { //心跳1秒 sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //判断线程是否结束 boolean isOver = true; for (MyThread thread : MyThread.list) { // 如果有一个活着就没有结束 if (thread.isAlive()) { isOver = false; } } //输出格式化 if (n % 10 == 0 && n != 0) { System.out.println(); } //结果输出 if (isOver) { System.out.print(n++ + "-" + MyThread.i + "; "); MyThread.i = 0; MyThread.list = new ArrayList<MyThread>(); new MyThread().launch(); } } } }
运行结果: 0-37; 1-44; 2-40; 3-43; 4-47; 5-46; 6-43; 7-41; 8-44; 9-44; 10-37; 11-41; 12-40; 13-44; 14-39; 15-41; 16-40; 17-43; 18-39; 19-40; 20-41; 21-43; 22-39; 23-42; 24-43; 25-39; 26-42; 27-44; 28-41; 29-48; 30-48; 31-48; 32-48; 33-49; 34-50; 35-50; 36-49; 37-50; 38-46; 39-49; 40-50; 41-49; 42-50; 43-50; 44-47; 45-49; 46-49; 47-49; 48-48; 49-48; 50-49; 51-49; 52-50; 53-47; 54-49; 55-48; 56-48; 57-47; 58-50; 59-50; 60-48; 61-50; 62-50; 63-50; 64-49; 65-49; 66-49; 67-49; 68-50; 69-47; 70-47; 71-47; 72-48; 73-49; 74-48; 75-49; 76-50; 77-49; 78-49; 79-49; 80-49; 81-49; 82-49; 83-47; 84-48; 85-48; 86-49; 87-49; 88-49; 89-49; 期望结果: 0-50; 1-50;...... ......
问题补充
为何是这种结果额。。。。。。2011年11月21日 09:36
8个答案 按时间排序 按投票排序
-
import java.util.*; public class ThreadTest { public static void main(String[] args) throws InterruptedException { new Monitor().start(); new MyThread().launch(); } } class MyThread extends Thread { //被争抢资源 public static Integer i = 0; //线程容器 public static List<MyThread> list = new ArrayList<MyThread>(); //启动50个线程 public void launch() { for (int i = 0; i < 50; i++) { MyThread temThread = new MyThread(); list.add(temThread); temThread.start(); } } @Override public void run() { try { //增大争抢强度 Thread.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (MyThread.i) { //主要的任务 MyThread.i++; } } } class Monitor extends Thread { public int n = 0; @Override public void run() { while (true) { try { //心跳1秒 sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //判断线程是否结束 boolean isOver = true; for (MyThread thread : MyThread.list) { // 如果有一个活着就没有结束 if (thread.isAlive()) { isOver = false; } } //输出格式化 if (n % 10 == 0 && n != 0) { System.out.println(); } //结果输出 if (isOver) { System.out.print(n++ + "-" + MyThread.i + "; "); synchronized (MyThread.i) { MyThread.i = 0; } MyThread.list = new ArrayList<MyThread>(); new MyThread().launch(); } } } }
多说无用,直接上代码,其实在线程并发时,你要注意锁住得东西和地方,锁一些需要修改的步骤。2011年11月21日 12:49
-
Integer是不可变对象,你如果用他来做锁,就不能改变他,不然大家都锁到不同的对象上去了。如果你想一个对象既可以做锁,又可以改变,那只能改变这个对象内部结构中的数据。所以string呀,简单类型呀,都不能既做锁又改变。
2011年11月21日 09:36
-
呵呵,感谢:
tedeyang 写道的支持
写了一文,希望有所帮助:
[java]synchronized我的理解
同步的关键在:
1. 线程可以挂到对象上,这个玩意就是“监视器”
2. 线程的同步执行与“当前监视器”有关
2011年11月21日 09:36
-
都是自动拆包惹的祸啊
如果写成 i = new Integer(i.intValue()+1) 不能解决问题,就算用this、lock当锁,
Object lock = new Object();lock、this当锁都不可以的,
public static int i = 0;
如果这样一切就豁然开朗了
synchronized (MyThread.i) {
try {
//增大争抢强度
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
//主要的任务
MyThread.i++;
}
A获得MyThread.i(假如i=1)的锁,执行到++之后,但还没出同步块,i(假如i=2)改变了,外面的线程获得i锁进入同步块,多个线程同时执行一段代码,情况不可预料。
但是其中的封包拆包过程还是不太清楚,希望大牛指点啊2011年11月21日 09:36
-
skzr.org 写道
synchronized (MyThread.i) { try { //增大争抢强度 Thread.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } //主要的任务 MyThread.i++; }
确实获取了i的锁,但是自己又修改了i,MyThread.i++;
所以当其他程序尝试锁定i时i能锁定了,因为i变化了。
正解。都是自动拆包惹的祸啊。如果写成 i = new Integer(i.intValue()+1)楼主就不会想不通了。
所以还是建议用通用的lock对象: Object lock = new Object();
2011年11月21日 09:36
-
synchronized (MyThread.i) { try { //增大争抢强度 Thread.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } //主要的任务 MyThread.i++; }
确实获取了i的锁,但是自己又修改了i,MyThread.i++;
所以当其他程序尝试锁定i时i能锁定了,因为i变化了。
2011年11月21日 09:36
相关推荐
Java多线程测试工具在软件开发中扮演着至关重要的角色,尤其在性能优化和系统压力测试方面。本文将深入探讨Java多线程测试工具的重要性和使用,以"JMeter"为例,来阐述如何通过此类工具进行高效的压力测试和系统瓶颈...
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...
Java多线程读大文件 java多线程写文件:多线程往队列中写入数据
在“JAVA编写的多线程小弹球测试”项目中,开发者利用Java语言创建了一个生动有趣的多线程应用,即一个模拟小弹球运动的程序。这个程序的特点是弹球会随机出现、随机选择颜色,并且在碰到边界时能自动反弹,充分展示...
Java多线程是Java编程中的重要组成部分,尤其在并发编程领域,它扮演着...这个"java多线程测试实例"可能包含了上述部分或全部知识点的实际应用,通过下载并分析实例代码,可以加深对Java多线程编程的理解和实践能力。
在本项目中,“Java多线程测试程序”利用了这一特性,结合图形用户界面(GUI)框架JFrame,实现了企鹅在界面上的动态移动效果。 首先,我们来深入理解Java多线程。在Java中,每个运行的程序都有一个主线程,而多...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...
在分析Java 多线程特性的基础上, 探讨了Java 多线程的测试策略及测试方法, 提出Java 多线程测试由类测试、集成模块测试和系统测试三个层次组成, 并讨论了多线程的继承测试、同步测试以及效率测试。
### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
【doc】用JAVA多线程技术编写数据库压力测试程序
在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...
《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...
在Java编程中,多线程处理是提升程序性能和效率的重要手段,特别是在处理大量数据库数据时。本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等...
本资源主要探讨了如何在JAVA和C++中实现多线程,以及相关的测试和调试技术。 在JAVA中,多线程的实现主要依赖于`Thread`类和`Runnable`接口。开发者可以通过直接继承`Thread`类或实现`Runnable`接口来创建新的线程...
JAVA多线程练习题答案详解 在本文中,我们将对 JAVA 多线程练习题的答案进行详细的解释和分析。这些题目涵盖了 JAVA 多线程编程的基本概念和技术,包括线程的生命周期、线程同步、线程状态、线程优先级、线程安全等...
在Java编程中,多线程技术是处理大数据批量导入或导出的重要手段。它能有效提升程序执行效率,尤其在数据库操作这样的I/O密集型任务中。本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量...
在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点...
Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...