Newer
Older
libj / modules / j / base / src / thread.cpp
#include <j.hpp>

#include <j/lang/thread.hpp>
#include <j/lang/thread.hpp>

namespace j
{
    namespace lang
    {
        /**
         * 新しい Thread オブジェクトを割り当てます。
         */
        Thread::Thread() noexcept : target(nullptr), aliveState(false)
        {
            // NOP
        }

        /**
         * 新しい Thread オブジェクトを割り当てます。
         *
         * @param target このスレッドの起動時に呼び出される run メソッドを含むオブジェクト
         */
        Thread::Thread(Runnable *r) noexcept : target(r), aliveState(false)
        {
            // NOP
        }

        // ムーブコンストラクタ
        Thread::Thread(Thread &&t) noexcept : Object(std::move(t)), target(std::move(t.target)), tid(std::move(t.tid)), aliveState(std::move(t.aliveState))
        {
            // NOP
        }

        // デストラクタ
        Thread::~Thread() noexcept
        {
            // NOP
        }

        // ムーブ代入演算子
        Thread &Thread::operator=(Thread &&t) noexcept
        {
            if (this != &t)
            {
                Object::operator=(std::move(t));
                tid = std::move(t.tid);
                target = std::move(t.target);
            }
            return *this;
        }

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

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

        void Thread::run()
        {
            // NOP
        }

        /**
         * スレッドが終了するのを待機します。
         */
        void Thread::join()
        {
            if (tid.joinable())
            {
                tid.join();
            }
        }

        /**
         * スレッドを開始します。
         */
        void Thread::start()
        {
            tid = std::thread(&Thread::execRun, this);
        }

        /**
         * スレッドのIDを返します。
         *
         * @return スレッドのID
         */
        std::thread::id Thread::getId()
        {
            return tid.get_id();
        }

        /**
         * 指定された ms 間現在のスレッドをスリープさせます。
         *
         * @param time スリープするミリ秒数
         */
        void Thread::sleep(long time)
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(time));
        }

        /**
         * 現在のスレッドが現在のプロセッサ使用料を譲る用意があることを示すヒントを与える。
         */
        void Thread::yield()
        {
            std::this_thread::yield();
        }

        /**
         * start 実施時に内部的に呼び出されるメソッド。
         */
        void Thread::execRun()
        {
            aliveState = true;
            try
            {
                if (target)
                {
                    target->run();
                }
                else
                {
                    this->run();
                }
            }
            catch (...)
            {
                // NOP
            }
            aliveState = false;
        }
    } // namespace lang
} // namespace j