class jThread
{
private:
	bool Alive;
	HANDLE hThread;
public:
	jThread() : Alive(false), hThread(NULL)
	{
		
	}
	virtual ~jThread()
	{
		CloseHandle(hThread);
	}
	void Start()
	{
		if( !Alive )
		{	
			hThread = (HANDLE) _beginthreadex(NULL,0,Ready,this,NULL,NULL);

			if(hThread == NULL)
			{
				throw std::bad_alloc("스레드 생성과정에서 에러가 발생했습니다.");
			}

			Alive = true;
		}
	}
	void Pause()
	{
		SuspendThread(hThread);
	}
	void Resume()
	{
		ResumeThread(hThread);
	}
	void Join()
	{
		WaitForSingleObject(hThread,INFINITE);
	}

	const bool IsAlive() const
	{
		return this->Alive;
	}

private: 
	static unsigned int __stdcall Ready(void* ptr)
	{
		jThread* ThisPtr = (jThread*)ptr;
	
		ThisPtr->Run();
		ThisPtr->Alive = false;
		return 0;
	}
protected:
	virtual void Run()
	{
		printf("Thread");
	}

};