多个任务运行终止以及资源共享例子

本文介绍了一个使用多线程实现的公园人流计数系统。通过在每个入口设置计数器,并利用同步方法确保线程安全,最终汇总各入口的计数结果来得到公园总的访客数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:
公园的管理人员希望知道每天通过多个大门进入公园的总人数,这样为每个门设置一个计数器,总人数也就是各个计数器的和,代码如下所示:

计数器类
public class Count {
private int count=0;
private Random rand=new Random(47);

public synchronized int increment(){
int temp=count;
if(rand.nextBoolean())
Thread.yield();
return (count=++temp);
}

public synchronized int value(){
return count;
}


}

=====================Entrance
public class Entrance implements Runnable{
private static Count count=new Count();

private static List<Entrance> entrances=new ArrayList<Entrance>();

private int sum=0;

private final int id;

private static volatile boolean canceled=false;

public static void cancel(){
canceled=true;
}


public Entrance(int id) {
// TODO Auto-generated constructor stub
this.id=id;
entrances.add(this);
}



@Override
public void run() {
// TODO Auto-generated method stub
while(!canceled){
synchronized(this){
++sum;
}

System.out.println(this+" Total:"+count.increment());
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("sleep interrupted...");
}


}

System.out.println("Stopping:"+this);
}


public synchronized int getValue(){
return sum;
}

@Override
public String toString() {
// TODO Auto-generated method stub
return "Entrance "+id+":"+getValue();
}


public static int getTotalCount(){
return count.value();
}

public static int sumEntrances(){
int sum=0;
for(Entrance entrance:entrances){
sum+=entrance.getValue();

}
return sum;
}
}

===========================公园管理人员查看这几个门的进入人数
public class Garden {

public static void main(String[] args) throws InterruptedException{
ExecutorService exec=Executors.newCachedThreadPool();
for(int i=0;i<5;i++) //这里面有5个入口
exec.execute(new Entrance(i));//启动线程计数人数
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Entrance.cancel();//各个任务共享的变量终止
exec.shutdown();
if(!exec.awaitTermination(250,TimeUnit.MILLISECONDS ));
System.out.println("some tasks was not terminated!");
System.out.println("total:"+Entrance.getTotalCount());
System.out.println("sum of entrances :"+Entrance.sumEntrances());

}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值