Java-多线程中java对象怎样管理的?

发布于 2017-01-06 01:57:40 字数 259 浏览 1024 评论 4

public class Count {
private int num;

public void count(){
for(int i=0;i<=10;i++){
num += i;
}
System.out.println(Thread.currentThread().getName()+"--"+num);
}

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

夜无邪 2017-10-13 21:15:39

这里改写了下代码,主要看注释。

 package com.ybl.test.test;

public class Count {
private int num;
private static long t1 = 0;
private int count = 0; // 统计执行的次数

public void count() {
// 可以使用同步锁,看执行的次数之类
// public synchronized void count() {
// 如果想看更好的效果,或者说更差的效果,就创建一个temp1,然后改值
int temp1 = 10000;
for (int i = 0; i <= temp1; i++) {
num += i;
//
t1 += i;
count++;
}
System.out.println(Thread.currentThread().getName() + "__" + num + "__"
+ "常量:" + t1 + "__" + count + "次");
}
}

 package com.ybl.test.test;

public class RunnableTest1 implements Runnable {
// 这里直接实例化了对象。
// 如果只实例化一次RunnableTest1类,那么只有一个Count对象
private Count count = new Count();

public void run() {
count.count();
}
}

 package com.ybl.test.test;

public class TestThread {

public static void main(String[] args) {
// 改写后的写法

// 这里指实例化一个RunnableTest1对象,所以只存在一个RunnableTest1对象,一个Count对象。

// cpu会以一种类似于公平的方式去执行线程,也就是说cpu会随机的给处于runnable状态下的线程分配时间段,
// 时间段很短的,尽量做到每个线程做一下动作,假如有(a,b,c)3个线程,jvm先会让a线程动一下,然后会让b动一下,下面是c动一下,尽量做到a>b>c这样的循环动作,
// 可能做不到绝对控制,也可能有其他的原因,所以并不会按照想象中的去执行线程。
// 一个线程执行完后,又会回到runnable状态,继续等待cpu分配时间段。

RunnableTest1 run1 = new RunnableTest1();
for (int i = 0; i < 10; i++) {
new Thread(run1).start();
}

// 本人其实也是菜鸟,说错的地方,请指正。
// 和cpu有关系的,多线程弄不好,会造成数据错误,效率低下等问题,请保重。
// 我对java底层也不了解。
// 如果代码写的复杂,可以拆分,弄简单点。
}

}

灵芸 2017-05-20 01:39:56

程序里面只有一个Runnable对象,就是在main线程中声明的那个runnable
你新建了10个线程(Thread-0...9),每个线程都引用了同一个runnable,这是会导致资源抢占,使runnable对象状态不稳定。

灵芸 2017-04-16 23:20:01

这个输出顺序不一定是固定的,在相同的机器上,多运行几次,或者在不同的jvm下,不同的平台下,
都会有不同的输出顺序
取决于jvm的调度.

简单的说,就是一个实例,进行了10次调用,把main class改成下面的代码,你就会看到顺序的输出:

public class TT {
public static void main(String[] args) {
Count count = new Count();
for(int i = 0; i < 10; i++) {
count.count();
}
}
}

把Count count = new Count();
放到一个runable里,唯一的变化就是每一次Count调用的顺序不是固定的了,
是由jvm调度了.

这个runable对象在JVM的内存管理里,只在堆内存中存在一个,然后在循环中被引用了10次,
而且这10次的执行顺序是不固定的.

仅此而已.

甜柠檬 2017-02-16 02:26:20

Runnable和Thread两种实现多线程的方式,数据的结果是不同的。原因是Runnable中多个线程共享target对象,也就是num对象。如果用Thread就会是两种不同的结果,楼主可以尝试一下。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文