java学习之协调同步的线程

时间:2023-03-08 20:59:46

当一个线程使用的同步方法中用到某个变量,而此变量有需要其他线程修改后才能符合本线程的需要,

那么可以在同步方法中使用wait(),wait方法可以中断线程的执行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。

其他线程如果在使用这个同步方法时,不许需要等待,那么它使用这个同步方法。其他线程如果再使用这个同步方法是不需要等待,那么它使用完

这个同步方法的同时,应当用notifyAll()方法通知所有由于使用这个同步方法而处于等待的线程结束等待.曾中断的线程就会从刚才的中断处继续执行

这个同步方法.....

 /*
wait();
notify();
notifyAll();
*/

在下面的列子中:

/*
张飞和李逵买电影票。售票员只有两张5元的钱,电影票5元一张。张飞
拿20元一张的人民币排在李逵的前面买票,李逵拿一张5元的人民币买票,因此张飞必须等待。
*/
 //package Scan_boobs;
public class Example12_8 extends window_scan
{
public static void main(String args [] )
{
TicketHouse officer = new TicketHouse();
Thread zhangfei ,likui;
zhangfei = new Thread(officer);
zhangfei.setName("张飞");
likui = new Thread(officer);
likui.setName("李逵");
zhangfei.start();
likui.start();
}
} class TicketHouse implements Runnable
{
int fiveAmount=2,tenAmount=0,twentyAmount=0;
@Override
public void run() {
// TODO Auto-generated method stub
String name=Thread.currentThread().getName();
if(name.equals("张飞")) saleTicket(20);
else saleTicket(5); }
private synchronized void saleTicket(int money)
{
if(money==5)
{
fiveAmount++;
this.out("给"+Thread.currentThread().getName()+"入场卷 ,"
+Thread.currentThread().getName()+"的钱正好");
}
else if(money==20)
{
while(fiveAmount<3)
{
try {
this.out("\n"+Thread.currentThread().getName()+"靠边等....");
wait();
// Thread.sleep(3000);
this.out("\n"+Thread.currentThread().getName()+"继续买票");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
fiveAmount-=3;
twentyAmount++;
this.out("给"+Thread.currentThread().getName()+"入场卷,"
+Thread.currentThread().getName()+"给20,找赎15元");
}
notifyAll();
}
private void out(String name)
{
System.out.println(name);
}
}

java学习之协调同步的线程

需要特别注意:

/*
在许多实际的问题中wait方法应当放在一个"while(等待的条件){}"的循环语句中,而不是“if(等待条件){}的分支语句中”
*/

如果咸的蛋疼了,将wait();  ----》改为 Thread.sleep(); 然后呵呵,你会就会这样   java学习之协调同步的线程

代码:

 package Scan_boobs;
public class Example12_8 extends window_scan
{
public static void main(String args [] )
{
TicketHouse officer = new TicketHouse();
Thread zhangfei ,likui;
zhangfei = new Thread(officer);
zhangfei.setName("张飞");
likui = new Thread(officer);
likui.setName("李逵");
zhangfei.start();
likui.start();
}
} class TicketHouse implements Runnable
{
int fiveAmount=2,tenAmount=0,twentyAmount=0;
@Override
public void run() {
// TODO Auto-generated method stub
String name=Thread.currentThread().getName();
if(name.equals("张飞")) saleTicket(20);
else saleTicket(5); }
private synchronized void saleTicket(int money)
{
if(money==5)
{
fiveAmount++;
this.out("给"+Thread.currentThread().getName()+"入场卷 ,"
+Thread.currentThread().getName()+"的钱正好");
}
else if(money==20)
{
while(fiveAmount<3)
{
try {
this.out("\n"+Thread.currentThread().getName()+"靠边等....");
wait();
// Thread.sleep(3000);
this.out("\n"+Thread.currentThread().getName()+"继续买票");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
fiveAmount-=3;
twentyAmount++;
this.out("给"+Thread.currentThread().getName()+"入场卷,"
+Thread.currentThread().getName()+"给20,找赎15元");
}
notifyAll();
}
private void out(String name)
{
System.out.println(name);
}
}

效果图:

java学习之协调同步的线程