Тема: Чи потрібна у даному випадку синхронізація?
Задача така - потік виконує список завдань, які додаються динамічно до цього списку.Якщо потік їх виконав всі, то він засинає до находження наступних.
class MyThr implements Runnable
{
private List<String> tasks;
private Thread owner=null;
private boolean stop=false;
public MyThr(List<String> tasks)
{
this.tasks=tasks;
}
public void Stop()
{
stop=true;
}
@Override
public void run()
{
// TODO Auto-generated method stub
for(;;)
{
if(stop==true){break;}
if(owner==null)
{
owner=Thread.currentThread();
}
if(tasks.isEmpty()==false)
{
String task=(String) tasks.get(0);
tasks.remove(task);
System.out.println(task);
try
{
owner.sleep(2000);//імітація затримки,під час обміну даними через сіть
}
catch (InterruptedException e){ }
}
else
{
try
{
owner.sleep(Long.MAX_VALUE);
}
catch (InterruptedException e){ }
}
}
}
}
public class Main
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
List<String> tasks=new ArrayList<String>();
tasks.add("1111");
tasks.add("2222");
tasks.add("3333");
tasks.add("4444");
MyThr mthr=new MyThr(tasks);
Thread thr=new Thread(mthr);
thr.start();
for(int i=0;i<10;i++)
{
tasks.add(String.valueOf(i+1)+" !!!! ");
}
if(thr.getState() == java.lang.Thread.State.TIMED_WAITING)
{
thr.interrupt();
}
try
{
System.in.read();
}
catch (IOException e) { }
mthr.Stop();
thr.interrupt();
}
}
ЧИ обов'язково синхронізувати доступ до List<String> ?