yield
日本語 | 放棄、歩留まり |
英語 | yield |
ふりがな | いーるど |
フリガナ | イールド |
Threadクラスのメソッド。
staticメソッドであり「Thread.yield()」という形で呼び出す。
このメソッドを呼び出したスレッドを、一時的に休止するためのメソッド。
「休止」と言っても、「何秒」という形で休止するわけではない。
このメソッドは、他のスレッドに処理を譲るために使用する。
OSがマルチスレッドに対応していても、マシンのCPUが1つしかない場合、実際に処理が行われるのは1スレッドである。
そのため、マルチスレッドで同時に処理をしているように見えても、実際には1つのスレッドがCPUを占有し、処理をし続ける。何かの機会でスレッドが一時停止すると、その時点で初めて他のスレッドと交代する。交代したスレッドがCPUを占有し、処理をし続ける。
このように、マルチスレッドにおいて、各スレッドは「偏った」処理が行われる。
この偏りを無くすのがyield()メソッドである。
yield()メソッドは、ほんの一瞬休止することで、他のスレッドに処理を譲る。
この処理を行うことで複数のスレッドが「同時処理」されるようになるため、マルチスレッドで同期を取る上で「並行処理」が行いたい場合にはこのメソッドを使用するのがいいだろう。
これとは別に、ビジネス用語、業務用語として「歩留まり」という意味を持つ。
「歩留まり」とは、「生産された製品のうちの、不良品ではない製品の割合」を表す。工場や納品管理等の業務に出てくる用語である。
発音が難しい用語のひとつでもある。
staticメソッドであり「Thread.yield()」という形で呼び出す。
このメソッドを呼び出したスレッドを、一時的に休止するためのメソッド。
「休止」と言っても、「何秒」という形で休止するわけではない。
このメソッドは、他のスレッドに処理を譲るために使用する。
OSがマルチスレッドに対応していても、マシンのCPUが1つしかない場合、実際に処理が行われるのは1スレッドである。
そのため、マルチスレッドで同時に処理をしているように見えても、実際には1つのスレッドがCPUを占有し、処理をし続ける。何かの機会でスレッドが一時停止すると、その時点で初めて他のスレッドと交代する。交代したスレッドがCPUを占有し、処理をし続ける。
このように、マルチスレッドにおいて、各スレッドは「偏った」処理が行われる。
この偏りを無くすのがyield()メソッドである。
yield()メソッドは、ほんの一瞬休止することで、他のスレッドに処理を譲る。
この処理を行うことで複数のスレッドが「同時処理」されるようになるため、マルチスレッドで同期を取る上で「並行処理」が行いたい場合にはこのメソッドを使用するのがいいだろう。
これとは別に、ビジネス用語、業務用語として「歩留まり」という意味を持つ。
「歩留まり」とは、「生産された製品のうちの、不良品ではない製品の割合」を表す。工場や納品管理等の業務に出てくる用語である。
発音が難しい用語のひとつでもある。
参考サイト
// Sample.java
public class Sample
{
public static void main( String[] args )
{
System.out.println( System.currentTimeMillis() );
// 1134541870061
// yield()メソッドで一時的に休止します。
Thread.yield();
System.out.println( System.currentTimeMillis() );
// 1134541870061
// このように、「目に見えて」休止することはありません。
OtherThread thread = new OtherThread();
// もうひとつスレッド(スレッドB)を作ります。
thread.start();
// スレッドAからrunner()メソッドを呼び出します。
runner();
// スレッドA : 0
// スレッドA : 1
// スレッドA : 2
// スレッドA : 3
// スレッドA : 4
// スレッドA : 5 // スレッドAがここからyield()メソッドを呼び始めます。
// スレッドB : 0
// スレッドB : 1
// スレッドB : 2
// スレッドB : 3
// スレッドB : 4
// スレッドB : 5 // スレッドBがここからyield()メソッドを呼び始めます。
// スレッドA : 6
// スレッドB : 6
// スレッドA : 7
// スレッドB : 7
// スレッドA : 8
// スレッドB : 8
// スレッドA : 9
// スレッドB : 9
// このように、最初の5周はそれぞれのスレッドが
// ずっとループ処理を行っていて、もう片方の
// スレッドに処理を譲りません。
// ですが、5周目以降は毎回yield()メソッドを呼び出して
// 「他のスレッドに処理を譲る」ので、お互いに
// 処理を行うようになります。
}
/**
* スレッドAから呼び出されます。
*/
public static void runner()
{
for( int iF1 = 0; iF1 < 10; ++iF1 )
{
System.out.println( "スレッドA : " + iF1 );
// 5以上の場合には毎周yield()メソッドを呼び出します。
if( 5 <= iF1 )
{
Thread.yield();
}
}
}
}
/**
* 別スレッドとして実行するためのクラス。
*/
class OtherThread extends Thread
{
/**
* Threadクラスのrun()メソッドを
* オーバーライドしたメソッド。このメソッドが
* 別スレッドとして呼び出されます。
*/
public void run()
{
for( int iF1 = 0; iF1 < 10; ++iF1 )
{
System.out.println( "スレッドB : " + iF1 );
// 5以上の場合には毎周yield()メソッドを呼び出します。
if( 5 <= iF1 )
{
Thread.yield();
}
}
}
}
public class Sample
{
public static void main( String[] args )
{
System.out.println( System.currentTimeMillis() );
// 1134541870061
// yield()メソッドで一時的に休止します。
Thread.yield();
System.out.println( System.currentTimeMillis() );
// 1134541870061
// このように、「目に見えて」休止することはありません。
OtherThread thread = new OtherThread();
// もうひとつスレッド(スレッドB)を作ります。
thread.start();
// スレッドAからrunner()メソッドを呼び出します。
runner();
// スレッドA : 0
// スレッドA : 1
// スレッドA : 2
// スレッドA : 3
// スレッドA : 4
// スレッドA : 5 // スレッドAがここからyield()メソッドを呼び始めます。
// スレッドB : 0
// スレッドB : 1
// スレッドB : 2
// スレッドB : 3
// スレッドB : 4
// スレッドB : 5 // スレッドBがここからyield()メソッドを呼び始めます。
// スレッドA : 6
// スレッドB : 6
// スレッドA : 7
// スレッドB : 7
// スレッドA : 8
// スレッドB : 8
// スレッドA : 9
// スレッドB : 9
// このように、最初の5周はそれぞれのスレッドが
// ずっとループ処理を行っていて、もう片方の
// スレッドに処理を譲りません。
// ですが、5周目以降は毎回yield()メソッドを呼び出して
// 「他のスレッドに処理を譲る」ので、お互いに
// 処理を行うようになります。
}
/**
* スレッドAから呼び出されます。
*/
public static void runner()
{
for( int iF1 = 0; iF1 < 10; ++iF1 )
{
System.out.println( "スレッドA : " + iF1 );
// 5以上の場合には毎周yield()メソッドを呼び出します。
if( 5 <= iF1 )
{
Thread.yield();
}
}
}
}
/**
* 別スレッドとして実行するためのクラス。
*/
class OtherThread extends Thread
{
/**
* Threadクラスのrun()メソッドを
* オーバーライドしたメソッド。このメソッドが
* 別スレッドとして呼び出されます。
*/
public void run()
{
for( int iF1 = 0; iF1 < 10; ++iF1 )
{
System.out.println( "スレッドB : " + iF1 );
// 5以上の場合には毎周yield()メソッドを呼び出します。
if( 5 <= iF1 )
{
Thread.yield();
}
}
}
}
// Sample.java public class Sample { public static void main( String[] args ) { System.out.println( System.currentTimeMillis() ); // 1134541870061 // yield()メソッドで一時的に休止します。 Thread.yield(); System.out.println( System.currentTimeMillis() ); // 1134541870061 // このように、「目に見えて」休止することはありません。 OtherThread thread = new OtherThread(); // もうひとつスレッド(スレッドB)を作ります。 thread.start(); // スレッドAからrunner()メソッドを呼び出します。 runner(); // スレッドA : 0 // スレッドA : 1 // スレッドA : 2 // スレッドA : 3 // スレッドA : 4 // スレッドA : 5 // スレッドAがここからyield()メソッドを呼び始めます。 // スレッドB : 0 // スレッドB : 1 // スレッドB : 2 // スレッドB : 3 // スレッドB : 4 // スレッドB : 5 // スレッドBがここからyield()メソッドを呼び始めます。 // スレッドA : 6 // スレッドB : 6 // スレッドA : 7 // スレッドB : 7 // スレッドA : 8 // スレッドB : 8 // スレッドA : 9 // スレッドB : 9 // このように、最初の5周はそれぞれのスレッドが // ずっとループ処理を行っていて、もう片方の // スレッドに処理を譲りません。 // ですが、5周目以降は毎回yield()メソッドを呼び出して // 「他のスレッドに処理を譲る」ので、お互いに // 処理を行うようになります。 } /** * スレッドAから呼び出されます。 */ public static void runner() { for( int iF1 = 0; iF1 < 10; ++iF1 ) { System.out.println( "スレッドA : " + iF1 ); // 5以上の場合には毎周yield()メソッドを呼び出します。 if( 5 <= iF1 ) { Thread.yield(); } } } } /** * 別スレッドとして実行するためのクラス。 */ class OtherThread extends Thread { /** * Threadクラスのrun()メソッドを * オーバーライドしたメソッド。このメソッドが * 別スレッドとして呼び出されます。 */ public void run() { for( int iF1 = 0; iF1 < 10; ++iF1 ) { System.out.println( "スレッドB : " + iF1 ); // 5以上の場合には毎周yield()メソッドを呼び出します。 if( 5 <= iF1 ) { Thread.yield(); } } } }