public class A { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread1 td=new Thread1();
new Thread(td).start();
new Thread(td).start();
new Thread(td).start(); }}class Thread1 implements Runnable {
private int i=5; @Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized(this){
if(i>0 && i!=0)
{
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" yunxin "+(i--)+" ci");
}
}
}
}
Thread-1 yunxin 5 ci
Thread-2 yunxin 4 ci
Thread-2 yunxin 3 ci
Thread-2 yunxin 2 ci
Thread-2 yunxin 1 ci线程,每次出的结果都不同 这个正常,但是我感觉应该都是同一个线程的5,4,3,2,1,不应该有上面的结果
还有问下,private 的i,每个线程都是公用的i,当Thread-1做好了i=5之后,this的锁还是应该在Thread-1上面的,为什么紧接着Thread-2就能用了呢 ?此时锁不是应该在Thread-1上,只到它5次完成后,锁才能被释放 给其他线程用..
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread1 td=new Thread1();
new Thread(td).start();
new Thread(td).start();
new Thread(td).start(); }}class Thread1 implements Runnable {
private int i=5; @Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized(this){
if(i>0 && i!=0)
{
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" yunxin "+(i--)+" ci");
}
}
}
}
Thread-1 yunxin 5 ci
Thread-2 yunxin 4 ci
Thread-2 yunxin 3 ci
Thread-2 yunxin 2 ci
Thread-2 yunxin 1 ci线程,每次出的结果都不同 这个正常,但是我感觉应该都是同一个线程的5,4,3,2,1,不应该有上面的结果
还有问下,private 的i,每个线程都是公用的i,当Thread-1做好了i=5之后,this的锁还是应该在Thread-1上面的,为什么紧接着Thread-2就能用了呢 ?此时锁不是应该在Thread-1上,只到它5次完成后,锁才能被释放 给其他线程用..
解决方案 »
- MP3 编码总算初步完成了,就此打住
- IO新手。。一个小问题,希望大虾们不吝赐教。。
- List问题!
- s1 s2引用不同的实体,s3 s4是引用同一个实体...
- 求助,高手帮帮忙!!!
- 关于PACKAGE 和 IMPORT的问题,小问题,请教请教!
- 即时消息系统中开线程,如何才能做到效率高,反应快
- 究竟什么是"call by value" 和"call by reference"
- 我在jTable中加入了四条数据记录,然后remove()方法删除其中的一行为何不行?
- ssm idea 运行项目的时候出现的一个问题(编译出错)
- 一道关于“蚂蚁上树”的java编程题
- 帮忙看个静态引用的问题,很简单 说明原因即可。
synchronized(this){的意思不是,
把当前对象的锁放在Thread-1上面的?那应该怎么理解synchronized(this)呢
new Thread(td).start();
new Thread(td).start();
new Thread(td).start();
3个Thread1对象,每个线程都在自己这个对象上加锁,互不影响。可以通过参数传一个公共对象,或者使用唯一的对象,比如利用字符串的性质使用synchronized("abc"),
或者synchronized(Thread1.class)等等
所有的线程都是一起共用的 那我这么写可以么:synchronized(i)?还有问下,一个类里面的成员变量,各个对象都是共用的么?是不是public的,就各个对象单独使用的?
问题的关键在于lz写的不对.synchronized(this)应该写在While外面.
LZ这样写在同步块完成到进入下一个循环前这段时间,其他线程可以抢占
线程sleep了,锁就释放了,其他都问题就都迎刃而解了吧?
楼上的,sleep是阻塞,不释放锁。
API:
sleep
public static void sleep(long millis)throws InterruptedException
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。该线程不丢失任何监视器的所属权。
楼主你写的代码好比,有个mm,现在在你这里,然后你去草场跑一圈,回来后你用绳子绑住她,逼她亲你一下,然后解开绳子,你再去跑一圈
可是你去跑的时候绳子已经解开了,mm随时会走掉啊
你需要做的就是,在你跑圈(while)的时候,也绑住她,那就可以了
只要把你的 while(true){ synchronized(this){
改成 synchronized(this){ while(true){
就是楼主“但是我感觉应该都是同一个线程的5,4,3,2,1 ” 的效果了