スレッドは初めてです。どうすれば入手することができますか t.join
動作し、それを呼び出すスレッドはtの実行が完了するまで待機しますか?
スレッドは自分自身が死ぬのを待っているので、このコードはプログラムを凍結するだけですよね?
public static void main(String[] args) throws InterruptedException {
Thread t0 = new Thready();
t0.start();
}
@Override
public void run() {
for (String s : info) {
try {
join();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("%s %s%n", getName(), s);
}
}
2つのスレッドがあり、そのうちの1つがinfo
配列の半分を出力し、残りのスレッドが完了するのを待ってから残りを実行したい場合はどうすればよいですか?
このようなものを使用してください:
public void executeMultiThread(int numThreads)
throws Exception
{
List threads = new ArrayList();
for (int i = 0; i < numThreads; i++)
{
Thread t = new Thread(new Runnable()
{
public void run()
{
// do your work
}
});
// System.out.println("STARTING: " + t);
t.start();
threads.add(t);
}
for (int i = 0; i < threads.size(); i++)
{
// Big number to wait so this can be debugged
// System.out.println("JOINING: " + threads.get(i));
((Thread)threads.get(i)).join(1000000);
}
OtherThreadが他のスレッドであるため、次のようなことができます。
@Override
public void run() {
int i = 0;
int half = (info.size() / 2);
for (String s : info) {
i++;
if (i == half) {
try {
otherThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("%s %s%n", getName(), s);
Thread.yield(); //Give other threads a chance to do their work
}
}
SunのJavaチュートリアル: http://Java.Sun.com/docs/books/tutorial/essential/concurrency/join.html
他のスレッドでjoin
メソッドを呼び出す必要があります。
何かのようなもの:
@Override
public void run() {
String[] info = new String[] {"abc", "def", "ghi", "jkl"};
Thread other = new OtherThread();
other.start();
for (int i = 0; i < info.length; i++) {
try {
if (i == info.length / 2) {
other.join(); // wait for other to terminate
}
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("%s %s%n", getName(), info[i]);
}
}