JavaA2Z

KAB-studio > プログラミング > JavaA2Z > yieldとは

yield

日本語 放棄、歩留まり
英語 yield
ふりがな いーるど
フリガナ イールド

解説

Threadクラスメソッド
staticメソッドであり「Thread.yield()」という形で呼び出す
 
このメソッド呼び出しスレッドを、一時的に休止するためのメソッド
「休止」と言っても、「何秒」という形で休止するわけではない。
このメソッドは、他のスレッドに処理を譲るために使用する。
 
OSがマルチスレッドに対応していても、マシンのCPUが1つしかない場合、実際に処理がわれるのは1スレッドである。
そのため、マルチスレッドで同時に処理をしているように見えても、実際には1つのスレッドがCPUを占有し、処理をし続ける。何かの機会でスレッドが一時停止すると、その時点で初めて他のスレッドと交代する。交代したスレッドがCPUを占有し、処理をし続ける。
 
このように、マルチスレッドにおいて、各スレッドは「偏った」処理がわれる。
この偏りを無くすのがyield()メソッドである。
yield()メソッドは、ほんの一瞬休止することで、他のスレッドに処理を譲る。
この処理をうことで複数のスレッドが「同時処理」されるようになるため、マルチスレッド同期を取る上で「並処理」がいたい場合にはこのメソッドを使用するのがいいだろう。
 
これとは別に、ビジネス用語、業務用語として「歩留まり」という意味を持つ。
「歩留まり」とは、「生産された製品のうちの、不良品ではない製品の割合」を表す。工場や納品管理等の業務に出てくる用語である。
 
発音が難しい用語のひとつでもある。

参考サイト


(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// 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()
    {
        forint 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()
    {
        forint 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();
            }
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

「解説」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2006/02/04
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。