论坛首页 Java企业应用论坛

java 多线程小练

浏览 9422 次
精华帖 (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 {
}
0 请登录后投票
   发表时间:2011-05-16  
这个贴的回复,真是杀人啊
0 请登录后投票
   发表时间: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 {
}

恩,同意,桥只是共享资源,不必关心方向问题
0 请登录后投票
   发表时间:2011-08-18  
yongqi 写道


class Person extends Thread {
	private String name;
	private Bridge bridge; 
	private int flag;;



// 从面向对象的角度来说,桥不是人的一个属性,所以应该把Bridge属性去掉。
// 那么,下面的同步块种就应该这样写:
synchronized (Bridge.class) {
			// ...
		}

0 请登录后投票
   发表时间:2011-08-19  
其实synchronized关键字作用简单点来说:
  在线程进入synchronized作用域的时候,如果是非静态方法或者非静态的块中锁住的就是某个实例,在静态的方法或者块中锁住就是某个类。
0 请登录后投票
   发表时间:2011-08-19  
fandayrockworld 写道
yongqi 写道


class Person extends Thread {
	private String name;
	private Bridge bridge; 
	private int flag;;



// 从面向对象的角度来说,桥不是人的一个属性,所以应该把Bridge属性去掉。
// 那么,下面的同步块种就应该这样写:
synchronized (Bridge.class) {
			// ...
		}



这位仁兄说的有道理,桥确实不是人的一个属性,但是这里的人有过桥这个方法啊,是不是在这种情况下,桥应该要设置成人的一个属性了呢?
求解
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics