「java入門」スレッドの排他制御(synchronized)サンプルプログラム
javaコード:
import java.util.*;
import java.util.concurrent.*;
class Task
{
private LinkedList<Integer> list = new LinkedList<Integer>();
private static int num=0;
public synchronized void take(){
while(num<=0){
try{
super.wait() ;
}catch(InterruptedException e){
e.printStackTrace() ;
}
}
num–;
int a=list.remove(0);
System.out.println(“after “+Thread.currentThread().getName()+" get="+a+" current size="+num);
super.notifyAll();
}
public synchronized void put(int a){
while(num>=10){
try{
super.wait() ;
}catch(InterruptedException e){
e.printStackTrace() ;
}
}
num++;
list.add(a);
System.out.println(“after “+Thread.currentThread().getName()+" put="+a+" current size="+num);
super.notifyAll();
}
};
class PutThread implements Runnable
{
private Task task;
private final CyclicBarrier cb;
public PutThread(Task task,CyclicBarrier cb)
{
this.task=task;
this.cb=cb;
}
public void run()
{
this.task.put(1);
try
{
cb.await();
}
catch (Exception e)
{
}
}
}
//取り出す
class TakeThread implements Runnable
{
private Task task;
private final CyclicBarrier cb;
public TakeThread(Task task,CyclicBarrier cb)
{
this.task=task;
this.cb=cb;
}
public void run()
{
this.task.take();
try
{
cb.await();
}
catch (Exception e)
{
}
}
}
public class startnews24Syn
{
public static void main(String [] args)
{
long start=(new Date()).getTime();
Task t=new Task();
final long begin=(new Date()).getTime();
CyclicBarrier cb =new CyclicBarrier(20000,new Runnable(){
public void run()
{
long end=(new Date()).getTime();
System.out.println(end-begin);
}
});
for(int i=0;i<10000;i++)
{
new Thread(new PutThread(t,cb)).start();
}
for(int j=0;j<10000;j++)
{
new Thread(new TakeThread(t,cb)).start();
}
}
}