锁定老帖子 主题:java 多线程小练
精华帖 (0) :: 良好帖 (1) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-15
我也写一个,我认为是人在过桥,桥只是一个资源,不知道是否正确,请大家指正
package org.wyq.test; public class MyTest { public static void main(String[] args) { Bridge bridge = new Bridge(); Person[] nperson = new Person[12]; // 站在北边的人 Person[] sperson = new Person[10]; // 站在南边的人 for (int i = 0; i < nperson.length; i++) { nperson[i] = new Person("np" + i, bridge, -1); nperson[i].start(); } for (int i = 0; i < nperson.length; i++) { nperson[i] = new Person("sp" + i, bridge, 1); nperson[i].start(); } } } /** * 人 */ class Person extends Thread { private String name; private Bridge bridge; private int flag;; public Person() { } public Person(String name, Bridge bridge, int flag) { this.name = name; this.bridge = bridge; this.flag = flag; } public void run() { crossBridge(); } /** * 过桥 */ public void crossBridge() { synchronized (bridge) { System.out.print(name + " 从" + (flag > 0 ? "南" : "北") + "面过桥"); try { Thread.sleep(500); // 过桥使用500ms } catch (InterruptedException e) { } System.out.println("\t\t到达" + (flag > 0 ? "北" : "南") + "面"); } } } /** * 桥 */ class Bridge { } |
|
返回顶楼 | |
发表时间:2011-05-16
这个贴的回复,真是杀人啊
|
|
返回顶楼 | |
发表时间:2011-05-16
yongqi 写道 我也写一个,我认为是人在过桥,桥只是一个资源,不知道是否正确,请大家指正
package org.wyq.test; public class MyTest { public static void main(String[] args) { Bridge bridge = new Bridge(); Person[] nperson = new Person[12]; // 站在北边的人 Person[] sperson = new Person[10]; // 站在南边的人 for (int i = 0; i < nperson.length; i++) { nperson[i] = new Person("np" + i, bridge, -1); nperson[i].start(); } for (int i = 0; i < nperson.length; i++) { nperson[i] = new Person("sp" + i, bridge, 1); nperson[i].start(); } } } /** * 人 */ class Person extends Thread { private String name; private Bridge bridge; private int flag;; public Person() { } public Person(String name, Bridge bridge, int flag) { this.name = name; this.bridge = bridge; this.flag = flag; } public void run() { crossBridge(); } /** * 过桥 */ public void crossBridge() { synchronized (bridge) { System.out.print(name + " 从" + (flag > 0 ? "南" : "北") + "面过桥"); try { Thread.sleep(500); // 过桥使用500ms } catch (InterruptedException e) { } System.out.println("\t\t到达" + (flag > 0 ? "北" : "南") + "面"); } } } /** * 桥 */ class Bridge { } 恩,同意,桥只是共享资源,不必关心方向问题 |
|
返回顶楼 | |
发表时间:2011-08-18
yongqi 写道 class Person extends Thread { private String name; private Bridge bridge; private int flag;; // 从面向对象的角度来说,桥不是人的一个属性,所以应该把Bridge属性去掉。 // 那么,下面的同步块种就应该这样写: synchronized (Bridge.class) { // ... } |
|
返回顶楼 | |
发表时间:2011-08-19
其实synchronized关键字作用简单点来说:
在线程进入synchronized作用域的时候,如果是非静态方法或者非静态的块中锁住的就是某个实例,在静态的方法或者块中锁住就是某个类。 |
|
返回顶楼 | |
发表时间:2011-08-19
fandayrockworld 写道 yongqi 写道 class Person extends Thread { private String name; private Bridge bridge; private int flag;; // 从面向对象的角度来说,桥不是人的一个属性,所以应该把Bridge属性去掉。 // 那么,下面的同步块种就应该这样写: synchronized (Bridge.class) { // ... } 这位仁兄说的有道理,桥确实不是人的一个属性,但是这里的人有过桥这个方法啊,是不是在这种情况下,桥应该要设置成人的一个属性了呢? 求解 |
|
返回顶楼 | |