2

2 つのスレッドがあるアプリケーションを作成したい 1 つのスレッドが char データを読み取り、別のスレッドがそれをコンソールに出力します。

From echo int  115 char value s
From echo int  116 char value t
From echo int  97 char value a
From echo int  99 char value c
From echo int  107 char value k
From echo int  111 char value o
From echo int  118 char value v
From echo int  101 char value e
From echo int  114 char value r
From echo int  102 char value f
From echo int  108 char value l
From echo int  111 char value o
From echo int  119 char value w
From echo int  10 char value 

コード:

import java.io.*;
class store
{
    int  i;
    public int get()
    {
        return i;
    }
    public void set(int i)
    {
        this.i=i;
    }
}
public class Main
{
    public static void main(String a[])
    {
        store s=new store();
        Thread th=new Thread(new read(s));
        Thread pr=new Thread(new echo(s));
        th.start();
        pr.start();             
    }   
}
class echo implements Runnable
{
    store st;
    public echo(store s)
    {
        st=s;
    }
    public void run()
    {       
        while(true)
        {
            int t=st.get();         
            if(t==-1)
                break;              
            if(t!=32)
            {
System.out.println("From echo int  "+t+" char value "+(char)st.get());  
            }
            st.set(0);
            try
            {
                //Thread.sleep(200);
                while(true)
                {
                    this.wait();
                    if(st.get()!=0)
                        break;

                }
            }
            catch(Exception r)
            {
            }
        }
    }   
}
class read implements Runnable
{
    FileReader fr=null;
    int r;
    store st;
    public read(store s)
    {
        st=s;
    }
    public void run()
    {
        try
        {
            fr=new FileReader("data.txt");
            while(true)
            {
                int r=fr.read();
                st.set(r);
                while(st.get()==0)
                {                   
                    this.wait();
                }   
                if(r==-1)
                    break;              
                try
                {
                    Thread.sleep(200);
                }
                catch(Exception re)
                {
                }
            }   
            st.set(-1);         
        }   
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {   
                fr.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();    
            }
        }               
    }
}

sleep()クラスの両方からメソッドを削除すると、次のread & echoようになります

From echo int  0 char value 
From echo int  0 char value 
From echo int  0 char value 
.
.
.

wait()別のスレッドが処理できるメソッドを使用しています。私は正しい方法でやっています、またはinterThreadCommunicationの別の方法があります

4

2 に答える 2

5

プロデューサー/コンシューマー パターンの使用を検討する必要があります。
スレッド A はファイルからエントリを読み取り、それらをキューに入れます。
スレッド B はキューからエントリを読み取り、それらを出力します。キューのスレッド セーフのためにブロッキング キュー
の実装を使用できます。エンキューとデキューの数を減らすために、キューに1文字ではなく、おそらく文字のグループ(単語または行)を入れることも検討します (これらのメソッドはスレッドセーフであるため、より高い同期されていない方法よりもパフォーマンスが低下します)。

于 2012-11-18T14:54:40.070 に答える
1

-書き込みスレッドがコンソールへの書き込みを開始する前に、最初の読み取りスレッドがファイルを完全に読み取るように、読み取りスレッド(つまり) でjoin()メソッドを使用できます。readThread.join()

例えば:

readThread.start();
try{
readThread.join()
}catch(Excpection ex){}

writeThread.start();

-これを使用して処理することもできますjava.util.concurrent.CountDownLatch

-SingleThreadExecutor並行パッケージからは、u の作業も行うと思います。

///////////////////////////編集部分/////////////////

-それらを同時に機能させたい場合は、wait/notify組み合わせまたはパッケージawait/signalからの組み合わせを使用してください。concurrent

- ライブラリArrayBlockingQueueからこれを達成するのにも役立ちます。concurrent

于 2012-11-18T14:52:45.030 に答える