Newer
Older
libj / include / j / lang / thread.hpp
/**
 * @file thread.hpp
 * @brief J Library Thread ヘッダファイル。
 * @copyright  2001 - 2024  Nomura Kei
 * @depends
 *   j/lang/object.hpp
 *   j/lang/string.hpp
 */
#ifndef J_LANG_THREAD_HPP
#define J_LANG_THREAD_HPP

#include <thread>

#include <j/lang/object.hpp>
#include <j/lang/string.hpp>
#include <j/lang/runnable.hpp>

namespace j
{
    namespace lang
    {

        class Thread : public Runnable, public Object
        {
        public:
            // デフォルトコンストラクタ
            Thread() noexcept;

            // コンストラクタ
            Thread(Runnable *r) noexcept;

            // コピーコンストラクタ
            Thread(const Thread &t) noexcept = delete;

            // ムーブコンストラクタ
            Thread(Thread &&t) noexcept;

            // デストラクタ
            virtual ~Thread() noexcept;

            // コピー代入演算子
            Thread &operator=(const Thread &t) noexcept = delete;

            // ムーブ代入演算子
            Thread &operator=(Thread &&t) noexcept;

            // スレッドに割り込みます。
            // void interrupt();

            // スレッドが生存しているか判定します。
            bool isAlive() const;

            virtual void run() override;

            // スレッドが終了するのを待機します。
            void join();

            // スレッドを開始します。
            void start();

            // スレッドのID
            std::thread::id getId();

            // 指定された ms 間現在のスレッドをスリープさせる。
            static void sleep(long time);

            static void yield();

        protected:
            virtual void execRun();
            Runnable *target;
            std::thread tid;
            bool aliveState;
        };

    } // namespace lang
} // namespace j

#endif // J_LANG_THREAD_HPP