15

在 Java 中,我有必要在另一个类似的类中实现一个扩展 Thread 的类。那可能吗?

我正在尝试做的一个示例是以下(简化的)代码段:

// The first layer is a Thread
public class Consumer extends Thread {

    // Variables initialized correctly in the Creator
    private BufferManager BProducer = null;

    static class Mutex extends Object {}
    static private Mutex sharedMutex = null;


    public Consumer() {
        // Initialization of the thread
        sharedMutex = new Mutex();

        BProducer = new BProducer(sharedMutex);
        BProducer.start();
    }


    public void run() {

        int data = BProducer.getData();

        ///// .... other operations
    }


    ////// ...... some code

    // Also the second layer is a Thread
    private class BufferManager extends Thread {

        Mutex sharedMutex;
        int data;

        public BufferManager(Mutex sM) {
            sharedMutex = sM;
        }

        public int getData(Mutex sM) {
            int tempdata;
            synchronized(sharedMutex) {
                tempdata = data;
            }
            return tempdata;
        }

        public void run() {
            synchronized(sharedMutex) {
                data = getDataFromSource();
            }
            ///// .... other operations on the data
        }
    }
}

第二个线程直接在第一个线程内部实现。此外,我想知道实现这样的互斥锁是否可行。如果没有,还有更好的(标准)方法吗?

先感谢您。

4

2 回答 2

29

不是在“内部”Thread运行,而是并排运行。

所以是的,您可以启动另一个Thread与其他两个并排运行Thread。事实上,任何人Thread都可以启动另一个Thread(只要操作系统允许)。

于 2012-06-19T19:15:23.727 回答
7

是的,这应该可以工作,并且共享的 Mutex 应该可以完成它的工作。出于偏执,我会同时声明互斥锁final以避免任何奇怪的“转义”问题。例如

final Mutex sharedMutex;

一个建议:也许这是我的风格,但对于这样的代码我很少扩展Thread. 只需实施Runnable即可。IMO 它有点不那么令人困惑(这里是 YMMV)。另外,当您开始使用高级并发实用程序(如Executor)时,它们处理的是Runnables,而不是线程。

于 2012-06-19T19:26:19.617 回答