0

スレッドを使用して基本的なプログラムを作成しようとしています。t1 と t2 の 2 つのスレッドがあり、x をロックしているとします。ロック x が t1 に割り当てられていると仮定します。ロック x が t1 に割り当てられているために t2 が処理できない状況はいつですか? ロック/スレッドがどのように機能するかを示す簡単な例を作成しようとしています。

この件についてご支援いただければ幸いです。

これは私がこれまでに得たものです:

クラス・スカイウォーカー:

import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Skywalker{
    public static void main(String args[]){
        Thread t1 = new Thread("station 1");
        Thread t2 = new Thread("station 2");

        t1.start();
        t2.start();
    }
}

ダース級:

import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Darth implements Runnable{
    String stationName;
    Lock x = new ReentrantLock();
    Random r = new Random();

    public Darth(String name){
        stationName = name;
    }

    public void run(){
        try{
            x.lock();
            System.out.println(stationName + "is working");
            sleep(randomTime);
            x.unlock();

        } catch(Exception e) {
        }
    }
}
4

1 に答える 1

0

たとえば、「リソースアクセス」を保護するには、ロックを1つのクラスに配置する必要があります。

class SharedResource {
    private static Lock lock = new ReentrantLock();

    public static void consumeResource(){
        try{
            lock.lock();
            //just one thread a time here
            int i = 10;
            //mock consuming shared resource:
            while(i>0){
                i--;
                System.out.println(Thread.currentThread().getName() + " is in");
                Thread.sleep(1000);
            }  
        }finally{
            lock.unlock();
        }
    }
 }

これで、一度に 1 つのスレッドだけが、lock/unlock ステートメント内にある consumerResource メソッドのコード行にアクセスできるようになります。Darth run メソッドから consumerResource を呼び出すことを示すのは簡単です。

于 2012-09-17T21:41:03.990 に答える