线程的同步,唤醒,等待的应用

龙腾冰 2011-10-17 01:28:14

class Port
{
private boolean flag = false;
public synchronized void inWater(){
if(flag){
try{
super.wait();
}catch(Exception e){
e.printStackTrace();
}
}
int i=1;
System.out.println("=====开始进水======");
while(i<=5){
try{
Thread.sleep(300);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("进水"+i+"分钟");
i++;
}
flag = true;
super.notify();
}
public synchronized void outWater(){
if(!flag){
try{
super.wait();
}catch(Exception e){
e.printStackTrace();
}
}
int i=1;
System.out.println("=====开始放水======");
while(i<=5){
try{
Thread.sleep(300);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("放水"+i+"分钟");
i++;
}
flag = false;
super.notify();
}
};

class Inwater implements Runnable
{
Port port = new Port();
public void run(){
port.inWater();
}
};
class Outwater implements Runnable
{
Port port = new Port();
public void run(){
port.outWater();
}
};
public class ThreadDemo01
{
public static void main(String[] args)
{
Inwater in = new Inwater();
Outwater out = new Outwater();
new Thread(in,"进水线程").start();
new Thread(out,"放水线程").start();
}
};

运行结果:
=====开始进水======
进水1分钟
进水2分钟
进水3分钟
进水4分钟
进水5分钟

这个题为什么只能进水不能放水呢啊?
...全文
98 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lliiqiang 2011-10-17
  • 打赏
  • 举报
回复
要设成static,否则两个对象的运行相互之间是独立的,不会产生任何影响
龙腾冰 2011-10-17
  • 打赏
  • 举报
回复
回复二楼,那样是不对的,因为你每次使用的还是原来的那个flag,新建的对象就是一个,每次都是一样的
龙腾冰 2011-10-17
  • 打赏
  • 举报
回复
恩,知道了啊,很好呢,谢谢了。是这个样子的,能否给解释一下所谓的同步和异步问题的区别,并且举个例子说明一下,特别是同步问题。谢谢啦
mannaking 2011-10-17
  • 打赏
  • 举报
回复
把private boolean flag = false;
改成:
private static boolean flag = false;
jc8futao 2011-10-17
  • 打赏
  • 举报
回复
虽然,你new了两个实例,这两个实例是完全不想干的,不在同一个线程。所以你在调用inwater的时候,虽然已经把flag置为true但是这个对outwaterh没有任何影响。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧