0

私はFileLockクラスを勉強しています。私がやりたいことはThreads、同時に実行され、1 つのファイルにアクセスする 3 つを開始することです。ファイルが 1 つのスレッドによってロックされている間、他の 2 つのスレッドはロックが解除されるまで順番を待つ必要があります。ただし、以下のコードを実行すると、すべてのスレッドが同時に開始されることさえありません。各run()メソッドが終了するとすぐに、スレッドが順番に開始されます。理解できない。

public class Main {

    public static void main(String[] args) {
        Main m = new Main();
        SomeThread t1 = m.new SomeThread("t1");
        SomeThread t2 = m.new SomeThread("t2");
        SomeThread t3 = m.new SomeThread("t3");
        t1.run();
        t3.run();
        t2.run();
    }

    class SomeThread implements Runnable {
        String name;

        public SomeThread(String s) {
            name = s;
        }

        @Override
        public void run() {
            System.out.println(name + " started!");
            OtherClass.access(name);
        }
    }

    static class OtherClass {
        static File file = new File("testfile.txt");

        public static void access(String name) {
            FileChannel channel = null;
            FileLock lock = null;
            try {
                channel = new RandomAccessFile(file, "rw").getChannel();
                lock = channel.lock();
                System.out.println("locked by " + name);
                Thread.sleep(3000);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                if (lock != null) {
                    try {
                        lock.release();
                        System.out.println("released by " + name);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                if (channel != null) {
                    try {
                        channel.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

取得しようとしているシナリオをどのように達成できますか? そして、なぜそれらは同時に開始しないのですか? lock()この方法では、同じファイルにアクセスしている他のスレッドがロックが解除されるまで待機するだけだと思いました。

4

2 に答える 2

4

Thread.startスレッドはではなくで始まりThread.runます。メインスレッドでメソッドを順番にrun呼び出すだけです。run

実際にはスレッドを作成していません:

public static void main(String[] args) {
    Main m = new Main();
    Thread t1 = new Thread(m.new SomeThread("t1"));
    Thread t2 = new Thread(m.new SomeThread("t2"));
    Thread t3 = new Thread(m.new SomeThread("t3"));
    t1.start();
    t2.start();
    t3.start();
}
于 2012-09-27T08:23:21.087 に答える