何明辉 发表于 2012-9-7 21:07
为什么不能实现交替打印了,只是输入一行数据之后程序就挂那儿了 - package heimabbs;
- class Ticket {
- private String name;
- public int count = 0;
- public void set(String name) {
- this.name = name;
- }
- public String get() {
- return this.name;
- }
- }
- class TicketRun implements Runnable {
- private Ticket tc;
- boolean flag = false;
- TicketRun(Ticket tc) {
- this.tc = tc;
- }
- public void run() {
- // 判断字符串是否相同,当然是用equals()方法了.
- if (Thread.currentThread().getName().equals("输入线程")) {
- while (true) {
- synchronized (tc) {
- // 这里一定要将if改为while哦,要不然多个线程间很容易造成死锁.
- // 我就不说为什么了,用文字会说很多的,老毕的视频会详细讲到的.
- while (flag)
- try {
- // 锁的什么对象,就要用该对象来调用wait()方法.
- tc.wait();
- } catch (Exception e) {
- e.printStackTrace();
- }
- tc.set("HeMingHui");
- System.out.println(Thread.currentThread().getName()
- + tc.get() + tc.count++);
- flag = true;
- // 锁的什么对象,就要用该对象来调用notify()方法.
- tc.notify();
- }
- }
- } else
- while (true) {
- synchronized (tc) {
- // 这里一定要将if改为while哦,要不然多个线程间很容易造成死锁.
- // 我就不说为什么了,用文字会说很多的,老毕的视频会详细讲到的.
- while (!flag)
- try {
- // 锁的什么对象,就要用该对象来调用wait()方法.
- tc.wait();
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName()
- + tc.get() + tc.count);
- flag = false;
- // 锁的什么对象,就要用该对象来调用notify()方法.
- tc.notify();
- }
- }
- }
- }
- public class TicketDemo {
- public static void main(String[] args) {
- Ticket tc = new Ticket();
- TicketRun p = new TicketRun(tc);
- Thread t1 = new Thread(p, "输入线程");
- Thread t2 = new Thread(p, "输出线程");
- t1.start();
- t2.start();
- }
- }
复制代码 你看,没问题啊,我给你的代码不存在你说的死锁问题. |