黑马程序员技术交流社区
标题:
线程死锁...
[打印本页]
作者:
jonn
时间:
2013-1-19 13:35
标题:
线程死锁...
本帖最后由 张向辉 于 2013-1-19 14:54 编辑
class User
{
private String name;
private float pay;
protected void setName(String name){
this.name=name;
}
protected String getName(){
return this.name;
}
protected void setPay(float pay){
this.pay=pay;
}
protected float getPay(){
return this.pay;
}
public boolean flag=false;
}
class AOper implements Runnable
{
private User user;
AOper(User user){
this.user=user;
}
public void run(){
while(true)
{
int i=0;
synchronized(user){
if(user.flag)
try{user.wait();}catch(Exception e){}
if(i==0){
user.setName("zk");
user.setPay(9000f);
}else{
user.setName("lii");
user.setPay(12000f);
}
i=(i+1)%2;
user.flag=true;
user.notify();
}
}
}
}
class BOper implements Runnable
{
private User user;
BOper(User user){
this.user=user;
}
public void run(){
synchronized(user){
if(!user.flag)
try{user.wait();}catch(Exception e){}
System.out.println("name:"+user.getName()+"--pay:"+user.getPay());
user.flag=false;
user.notify();
}
}
}
class UserTest
{
public static void main(String[] args)
{
User user=new User();
AOper a=new AOper(user);
BOper b=new BOper(user);
Thread t1=new Thread(a);
Thread t2=new Thread(b);
t1.start();
t2.start();
}
} // 执行程序后一直等待.....成了死锁,怎么改呢?
复制代码
作者:
唐晓
时间:
2013-1-19 13:46
本帖最后由 唐晓 于 2013-1-19 14:14 编辑
BOper 类的run方法里加一个while(true),让他永久的运行,不然BOper类运行完一次后会挂那了
作者:
高浩
时间:
2013-1-19 13:50
为啥要搞锁的嵌套呢,想让两线程到一种和谐状态时及其不易的,开发中躲还来不及呢,
死锁的原因:出现了嵌套锁,一个线程进入了另一进不去,不会去执行,到最后两个线程都进行不了
程序就挂了
作者:
txl
时间:
2013-1-19 14:12
同学你好,下面是我修改你的代码后的结果,里面有注释解释一些地方进行的改变
class User
{
private String name;
private float pay;
protected void setName(String name){
this.name=name;
}
protected String getName(){
return this.name;
}
protected void setPay(float pay){
this.pay=pay;
}
protected float getPay(){
return this.pay;
}
public boolean flag=false;
}
class AOper implements Runnable
{
private User user;
AOper(User user){
this.user=user;
}
public void run(){
int i=0; //这里应该把标记放在while(true)的外面,否则,i每次又都会等于0,else就执行不到
while(true)
{
synchronized(user){
if(user.flag)
try{user.wait();}catch(Exception e){}
if(i==0){
user.setName("zk");
user.setPay(9000f);
}else{
user.setName("lii");
user.setPay(12000f);
}
i=(i+1)%2;
user.flag=true;
user.notify();
}
}
}
}
class BOper implements Runnable
{
private User user;
BOper(User user){
this.user=user;
}
public void run(){
synchronized(user){
while(true){ //这里也需要使用while(true),之前是因为它只执行了一次
if(!user.flag)
try{user.wait();}catch(Exception e){}
System.out.println("name:"+user.getName()+"--pay:"+user.getPay());
user.flag=false;
user.notify();
}
}
}
}
class UserTest
{
public static void main(String[] args)
{
User user=new User();
AOper a=new AOper(user);
BOper b=new BOper(user);
Thread t1=new Thread(a);
Thread t2=new Thread(b);
t1.start();
t2.start();
}
} // 执行程序后一直等待.....成了死锁,怎么改呢?
复制代码
作者:
jonn
时间:
2013-1-19 19:27
辉哥,不是不给力,没事发发滴{:soso_e141:},我这一般用Lock接口实现多线程
作者:
Rancho_Gump
时间:
2013-1-19 19:33
赵文 发表于 2013-1-19 19:27
辉哥,不是不给力,没事发发滴,我这一般用Lock接口实现多线程
{:3_69:}{:3_48:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2