A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© U芽Lady 中级黑马   /  2013-4-20 21:37  /  1733 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 U芽Lady 于 2013-4-21 22:06 编辑

class Demo implements Runnable{
private int x = 20;
Object p = new Object();
public void run(){
  synchronized(p){   
   while(x>0){
   
    try{
     Thread.sleep(1000);
    }catch(Exception e){}
    //for(int y = -99999999;y<99999999;y++){}
    System.out.println(Thread.currentThread().getName() + "..." + x--);      
   }
  }  
}
}
class ThreadDemo1 {
public static void main(String[] args) {
  Demo d = new Demo();
  Thread t1 = new Thread(d);
  Thread t2 = new Thread(d);
  Thread t3 = new Thread(d);
  Thread t4 = new Thread(d);
  /*
  t1.setName("8");
  t2.setName("2");
  t3.setName("3");
  t4.setName("4");
  */
  t1.start();
  t2.start();
  t3.start();
  t4.start();
}
}

/*怎么只运行了一个线程呢,麻烦大神们帮忙调试一下,在此谢过

*/

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

12 个回复

倒序浏览
你代码的意思是 一个线程来到 synchronized(p)时,判断能不能进,进去后,在这个锁里面循环。
while(ture)
synchronized(p){
    if(x>0){}
     }
}
应该把循环放在锁外面

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
package cn.itcast.bank;
//创建一个类实现Runnable接口
class Demo implements Runnable{
private int x = 2000;
Object p = new Object();
  public void run(){  
   while(true){
           synchronized(p){
                   if(x>0){
                           try{
                                   Thread.sleep(10);
                                      }
                           catch(Exception e){}
                           System.out.println(Thread.currentThread().getName() + "..." + x--);      
                                      }
                                             }
                             }  
  }
}
class ThreadDemo1 {
public static void main(String[] args) {
  Demo d = new Demo();
  Thread t1 = new Thread(d);
  Thread t2 = new Thread(d);
  Thread t3 = new Thread(d);
  Thread t4 = new Thread(d);

  t1.start();
  t2.start();
  t3.start();
  t4.start();
}
}

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
续圆凯 发表于 2013-4-20 22:24
你代码的意思是 一个线程来到 synchronized(p)时,判断能不能进,进去后,在这个锁里面循环。
while(ture)
...

但是这样写循环不会自己结束,怎么结束循环语句呢
回复 使用道具 举报
HM汪磊 发表于 2013-4-20 22:38
package cn.itcast.bank;
//创建一个类实现Runnable接口
class Demo implements Runnable{

永远为真的循环,是死循环,怎么解决呢,
回复 使用道具 举报
U芽Lady 发表于 2013-4-21 15:18
永远为真的循环,是死循环,怎么解决呢,

我不明白你说的是什么意思??能否具体点,最好有代码
回复 使用道具 举报
HM汪磊 发表于 2013-4-21 15:23
我不明白你说的是什么意思??能否具体点,最好有代码

public void run(){  
    while(true){//这里是永远为真是把,虽然没有什么执行语句,但是他是不是一直在默默的运行呢
            synchronized(p){
回复 使用道具 举报
U芽Lady 发表于 2013-4-21 15:34
public void run(){  
    while(true){//这里是永远为真是把,虽然没有什么执行语句,但是他是不是一直在 ...

是啊,while(true){   这里的语句一直执行    }
但是在多线程中,CPU会将执行权分给不同的线程,由不同的线程来执行
回复 使用道具 举报
HM汪磊 发表于 2013-4-21 16:43
是啊,while(true){   这里的语句一直执行    }
但是在多线程中,CPU会将执行权分给不同的线程,由不同的 ...

但是票完了,线程没结束,有问题吧
回复 使用道具 举报
U芽Lady 发表于 2013-4-21 17:15
但是票完了,线程没结束,有问题吧

我试了试,你说的应该没错,票卖完线程依然没结束,这个程序是用来了解多线程的,学会其中知识点就行
回复 使用道具 举报
U芽Lady 发表于 2013-4-21 17:15
但是票完了,线程没结束,有问题吧

毕老师讲的是阶段性知识,后来的线程中会加flag做标记进行结束
一般线程结束靠的是循环结束(加标记,或者循环一定次数),或者强制结束
1.5还新特性(线程池、定时器),张老师会讲到,先给你提一下,有个印象
回复 使用道具 举报
HM汪磊 发表于 2013-4-21 17:38
我试了试,你说的应该没错,票卖完线程依然没结束,这个程序是用来了解多线程的,学会其中知识点就行 ...

谢谢,了解了
回复 使用道具 举报
曹睿翔 发表于 2013-4-21 17:52
毕老师讲的是阶段性知识,后来的线程中会加flag做标记进行结束
一般线程结束靠的是循环结束(加标记,或 ...

谢谢指教,懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马