黑马程序员技术交流社区
标题:
线程不稳定问题 求大神
[打印本页]
作者:
914360849
时间:
2015-6-27 00:27
标题:
线程不稳定问题 求大神
//定义两个线程,每隔300毫秒输出线程的名字,共输出20次
class ThreadTest02 {
public static void main(String[] args) {
// 建立MyThread 对象
MyThread2 t1 = new MyThread2();
MyThread2 t2 = new MyThread2();
// 为线程设置名字
t1.setName("我线程1");
t2.setName("线程2");
// 调用Thread类的start方法,启动线程
t1.start();
t2.start();
// System.out.println("Hello World!");
}
}
class MyThread2 extends Thread {
static int i = 0;// 定义计数变量
public void run() {
while (true) {
synchronized (this){//。 MyThread2.class替换this打印6次
if (i < 6) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
sop("name:" + Thread.currentThread().getName());
i++;<div class="blockcode"><blockquote>
复制代码
sop("i="+i);
}
}
}
}
// 屏幕输出方法
public static void sop(Object obj) {
System.out.println(obj);
}
}
输出结果:
name:线程2
name:我线程1
i=1
i=2
name:线程2
i=3
name:我线程1
i=4
name:线程2
i=5
name:我线程1
i=6
另一种输出结果:
name:我线程1
name:线程2
i=1
i=2
name:我线程1
name:线程2
i=3
i=4
name:我线程1
name:线程2
i=5
i=6
为什么出现这种情况;把synchronized中的this换为MyThread2.class为啥就正常了。
作者:
蓦然回首3Y
时间:
2015-6-27 07:04
也想学习下
作者:
懒锋2015
时间:
2015-6-28 10:03
呃,你这个问题很好解答:this是当前对象的引用,你用this并没有起到锁的作用,因为每个线程都有自己的对象,就有了多个锁;而.class是是这个类在方法区的字节码,是唯一的。
我不知道你是不是在试着解决那个技术分活动的问题,如果是的话,我说两句:毕老师的基础视频里没有提到多线程在监听时间这方面的东西,我去网上搜了相关的东西,解决起来不太简单的。这里有个逻辑:如果多个线程同时运行,每隔一定时间输出当前线程的名字。那么,输出当前线程的名字的命令必然是在当前运行线程中的。而时间这个条件,是客观的,是需要监听判断的。用sleep命令只是缓和下时间,但是破坏了系统在自己运行时自由切换线程的条件。
我们现在学的都是非常基础的东西,要把Java弄深弄懂不是看个几十天的视频和上几十天课就可以的,也因此,有些问题一旦研究深了就尴尬了。当然,我觉得黑马让我们有点Java基础是在培养思维,可以方便学后面的东西的,不一定要非常精深。
作者:
JJJD
时间:
2015-6-28 10:19
学习啦。。。
作者:
914360849
时间:
2015-6-28 21:00
懒锋2015 发表于 2015-6-28 10:03
呃,你这个问题很好解答:this是当前对象的引用,你用this并没有起到锁的作用,因为每个线程都有自己的对象 ...
谢谢 大神,
这个 是自测的时候 出来的 , 感觉以前的多线程全乱了,不知道咋回事
作者:
黑马无敌
时间:
2015-6-28 21:04
学习学习。。。。
作者:
zlpiano
时间:
2015-6-28 21:29
来学习下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2