线程同步问题简单例子

来源:互联网 发布:c语言function函数 编辑:程序博客网 时间:2024/05/19 17:03

1.编写多线程应用程序,模拟多个人通过一个山洞的模拟。这个山洞每次只能通过一个人,每个人通过山洞的时间为5秒,随机生成10个人,

同时准备过此山洞,显示一下每次通过山洞人的姓名。


 错误实例如下(虽考虑到对象同步问题,忽略了对象实例化问题,此时以山洞为对象,只能存在单一对象,否则则会成为单线程问题)

public class ThroughCave implements Runnable{

    private String name;

       public ThroughCave(Stringname) {

              // TODOAuto-generated constructor stub

              this.name = name;

       }

      

       @Override

       public void run() {

              // TODOAuto-generated method stub

              synchronized (this){

                    

                     try {

                            Thread.sleep(5000);

                     } catch(InterruptedException e) {

                            //TODO Auto-generated catch block

                            e.printStackTrace();

                     }

                     Thread.currentThread().setName(name);

                     System.out.println(Thread.currentThread().getName()+"已经通过");

              }

       }

 

      

}

 

public class TestThrough {

 

       public static voidmain(String[] args) {

              // TODOAuto-generated method stub

 

      //每次调用线程时都重新new了一个对象,实际则成为了10个线程同时进入10个山洞的问题,

//因此把它看成是多个窗口卖同一组票,但不能重复的问题相同了。

              new Thread(newThroughCave("a")).start();

              new Thread(new ThroughCave("b")).start();

              new Thread(newThroughCave("c")).start();

              new Thread(newThroughCave("d")).start();

              new Thread(newThroughCave("e")).start();

              new Thread(newThroughCave("f")).start();

              new Thread(newThroughCave("g")).start();

              new Thread(newThroughCave("h")).start();

              new Thread(newThroughCave("i")).start();

              new Thread(newThroughCave("j")).start();

             

             

      

             

             

       }

 

}

修改后的示例如下

public class ThroughCave implements Runnable{

    
@Override
public void run() {
// TODO Auto-generated method stub

getThrouth();
}


public synchronized void getThrouth(){

try {

Thread.sleep(5000);


} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


System.out.println(Thread.currentThread().getName()+"已经通过");

}

}

public class TestThrough {


public static void main(String[] args) {
// TODO Auto-generated method stub





ThroughCave tc = new ThroughCave();//一个对象
new Thread(tc, "a").start();//调用同一对象,a为线程名,此处可看做人名
new Thread(tc, "v").start();
new Thread(tc, "f").start();
new Thread(tc, "s").start();





}


}



0 0
原创粉丝点击