首页 / JAVA / 简单的Java多线程测试不起作用
简单的Java多线程测试不起作用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了简单的Java多线程测试不起作用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2926字,纯文字阅读大概需要5分钟。
内容图文
![简单的Java多线程测试不起作用](/upload/InfoBanner/zyjiaocheng/794/f46a20600ddf4a63a5d4c1c7dbf3f84f.jpg)
我写了一些java代码,使用while循环可以在1秒内增加一个值.
然后我尝试使用4个线程在1秒内尽可能多地增加四个值.我期待有四个线程,与简单循环相比,我会得到四倍的值.
代码如下:
package threadTest;
public class ThreadTestMain {
public static void main(String[] args) {
long end_time = 0;
long value = 0;
long runtime = 0;
long start_time = System.currentTimeMillis();
while (runtime<=1000) {
value++;
runtime = System.currentTimeMillis() - start_time;
}
System.out.println(value);
end_time = System.currentTimeMillis();
System.out.println("DEBUG-> Time should be 1sec : " + (end_time - start_time));
SeperateExecution myObject = new SeperateExecution(0);
SeperateExecution myObject2 = new SeperateExecution(0);
SeperateExecution myObject3 = new SeperateExecution(0);
SeperateExecution myObject4 = new SeperateExecution(0);
Thread worker1 = new Thread(myObject,"worker1");
Thread worker2 = new Thread(myObject2,"worker2");
Thread worker3 = new Thread(myObject3,"worker3");
Thread worker4 = new Thread(myObject4,"worker4");
worker1.start();worker2.start();worker3.start();worker4.start();
}
}
和
package threadTest;
//import java.util.concurrent.atomic.AtomicLong;
public class SeperateExecution implements Runnable {
private long value = 0;
//private AtomicLong value = null;
private long start_time = 0;
public SeperateExecution (long p_val)
{
this.value = p_val;
//this.value = new AtomicLong(p_val);
//this.start_time = p_st;
}
@Override
public void run(){
long runtime = 0;
this.start_time = System.currentTimeMillis();
while (runtime<=1000) {
//value.incrementAndGet();
value++;
runtime = System.currentTimeMillis() - start_time;
}
System.out.println(Thread.currentThread().getName() + " DONE " + value +
" Thread Exection Time " + (System.currentTimeMillis()- start_time));
}
}
代码输出如下:
52266551
DEBUG-> Time should be 1sec : 1001
worker1 DONE 13364059 Thread Exection Time 1001
worker2 DONE 13744972 Thread Exection Time 1001
worker4 DONE 11652084 Thread Exection Time 1001
worker3 DONE 13605645 Thread Exection Time 1001
有人可以帮助我理解为什么多线程值总和一个小于正常while循环的值?
一个类比,以帮助理解我的问题:如果一个工人一天可以挖一个洞,那么四个工人一天可以挖四个洞.
谢谢
解决方法:
你的结果的原因似乎相当明显:System.currentTimeMillis在某个地方获得了一个锁,这使得代码基本上是顺序的(内核调用是迄今为止在循环中完成的最昂贵的事情).
在这种情况下,您希望四个线程??的数量与顺序版本大致相同,这几乎就是发生的情况.
有趣的问题是为什么System.currentTimeMillis需要锁定?它是在src / os /< os> / vm / os_< os> .cpp中实现的本机函数,其中< os>是linux,windows还是solaris.稍微简化的函数在jdk9开发树中如下所示:
jlong os::javaTimeMillis() {
FILETIME wt;
GetSystemTimeAsFileTime(&wt);
return windows_to_java_time(wt);
}
因此,Java本身不会同步,因为GetSystemTimeAsFileTime是线程安全的.因此我们可以假设操作系统内部获取该方法的锁定 – 相当令人惊讶,我真的不明白为什么这是必要的…使用的结构只有8个字节,因此可以原子更新.
无论如何就是这样,如果在Linux上运行相同的代码不会表现出这样的行为,我不会感到惊讶.
内容总结
以上是互联网集市为您收集整理的简单的Java多线程测试不起作用全部内容,希望文章能够帮你解决简单的Java多线程测试不起作用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。