Załóżmy, że mam wątek A który uruchamia wątki B i C. Co się stanie z wątkami B i C gdy wątek a zakończy swoje działanie? Mam problem tutaj:
public class Letters extends Thread implements Iterable<Thread>
{
private String chars;
private Thread[] threads;
int index = 0;
public Letters(String chars)
{
this.chars = chars;
this.threads = new Thread[chars.length()];
for (int i = 0; i < threads.length; i++)
{
int finalI = i;
Thread thread = new Thread()
{
@Override
public void run()
{
while (!Letters.this.isInterrupted())
{
System.out.print(chars.charAt(finalI));
try
{
Thread.sleep((int) (Math.random() * 2000));
}
catch (InterruptedException e)
{
throw new RuntimeException(e);
}
}
}
};
threads[finalI] = thread;
}
}
@Override
public void run()
{
for (Thread thread : threads)
{
thread.start();
}
while (true)
{
if (this.isInterrupted())
return;
}
}
Iterator<Thread> threadsIterator = new Iterator<Thread>()
{
@Override
public boolean hasNext()
{
return index < threads.length;
}
@Override
public Thread next()
{
return threads[index++];
}
};
@Override
public Iterator iterator()
{
return threadsIterator;
}
}
i metoda main:
public static void main(String[] args)
{
Letters letters = new Letters("ABCD");
for (Thread t : letters)
System.out.println(t.getName() + " starting");
letters.start();
try
{
Thread.sleep(5000);
}
catch(InterruptedException ignore)
{
}
letters.interrupt();
System.out.println("\nProgram completed.");
}
Nie rozumiem do końca różnicy między isInterrupted()
i interrupted()
:
while (true)
{
if (this.isInterrupted())
return;
}
Gdy w warunku if użyję metody Thread.interrupted() to wtedy zostanie tylko zakończone wykonywanie metody run klasy letters ale już wątków uruchomionych przez tą metode nie. Jeśli użyję isInterrupted() to program kończy swoje działanie.