黑马程序员技术交流社区

标题: 多线程问题,求指教 [打印本页]

作者: U芽Lady    时间: 2013-4-20 21:37
标题: 多线程问题,求指教
本帖最后由 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();
}
}

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

*/


作者: 续圆凯    时间: 2013-4-20 22:24
你代码的意思是 一个线程来到 synchronized(p)时,判断能不能进,进去后,在这个锁里面循环。
while(ture)
synchronized(p){
    if(x>0){}
     }
}
应该把循环放在锁外面
作者: HM汪磊    时间: 2013-4-20 22:38
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();
}
}
作者: U芽Lady    时间: 2013-4-21 15:17
续圆凯 发表于 2013-4-20 22:24
你代码的意思是 一个线程来到 synchronized(p)时,判断能不能进,进去后,在这个锁里面循环。
while(ture)
...

但是这样写循环不会自己结束,怎么结束循环语句呢
作者: U芽Lady    时间: 2013-4-21 15:18
HM汪磊 发表于 2013-4-20 22:38
package cn.itcast.bank;
//创建一个类实现Runnable接口
class Demo implements Runnable{

永远为真的循环,是死循环,怎么解决呢,
作者: HM汪磊    时间: 2013-4-21 15:23
U芽Lady 发表于 2013-4-21 15:18
永远为真的循环,是死循环,怎么解决呢,

我不明白你说的是什么意思??能否具体点,最好有代码
作者: U芽Lady    时间: 2013-4-21 15:34
HM汪磊 发表于 2013-4-21 15:23
我不明白你说的是什么意思??能否具体点,最好有代码

public void run(){  
    while(true){//这里是永远为真是把,虽然没有什么执行语句,但是他是不是一直在默默的运行呢
            synchronized(p){
作者: HM汪磊    时间: 2013-4-21 16:43
U芽Lady 发表于 2013-4-21 15:34
public void run(){  
    while(true){//这里是永远为真是把,虽然没有什么执行语句,但是他是不是一直在 ...

是啊,while(true){   这里的语句一直执行    }
但是在多线程中,CPU会将执行权分给不同的线程,由不同的线程来执行
作者: U芽Lady    时间: 2013-4-21 17:15
HM汪磊 发表于 2013-4-21 16:43
是啊,while(true){   这里的语句一直执行    }
但是在多线程中,CPU会将执行权分给不同的线程,由不同的 ...

但是票完了,线程没结束,有问题吧
作者: HM汪磊    时间: 2013-4-21 17:38
U芽Lady 发表于 2013-4-21 17:15
但是票完了,线程没结束,有问题吧

我试了试,你说的应该没错,票卖完线程依然没结束,这个程序是用来了解多线程的,学会其中知识点就行
作者: 曹睿翔    时间: 2013-4-21 17:52
U芽Lady 发表于 2013-4-21 17:15
但是票完了,线程没结束,有问题吧

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

谢谢,了解了
作者: U芽Lady    时间: 2013-4-21 22:05
曹睿翔 发表于 2013-4-21 17:52
毕老师讲的是阶段性知识,后来的线程中会加flag做标记进行结束
一般线程结束靠的是循环结束(加标记,或 ...

谢谢指教,懂了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2