起线程,注意事项,生命周期

起线程,注意事项,生命周期


//收到交易弹出公告
void TradeMainUI::OnTradePoputBulletin(const string& seq)
{
//启动线程处理以下消息
char *temp = new char[128];
strcpy(temp, seq.c_str());
HANDLE hHandle = CreateThread(NULL, 0, TradePoputBulletinThread, (void*)(temp), 0, NULL);
CloseHandle(hHandle);

}
DWORD WINAPI TradeMainUI::TradePoputBulletinThread(LPVOID pVoid)
{
try
{
string seq = (char*)pVoid;
FTFutureTradeAgent* pAgent = (FTFutureTradeAgent*)((MQTradeRobot*)gPtrRobotQueen)->GetMarketTradeAgent();
TradeBulletin* pTradeBulletin = pAgent->GetTradeBulletinManager()->GetBulletinBySeq(seq);
if(pTradeBulletin != NULL)
{
TCHAR tcTitle[512] = {0};
TCHAR tcContent[1024] = {0};
EncodingHandler::MByteToWChar(pTradeBulletin->GetTitle().c_str(), tcTitle, 512);
EncodingHandler::MByteToWChar(pTradeBulletin->GetContent().c_str(), tcContent, 1024);
MessageBoxEx(NULL, tcContent, tcTitle, MB_OK | MB_TOPMOST, -1);
}
if (pVoid != NULL)
{
delete pVoid;
pVoid = NULL;
}
return 0;
}
catch(RunTimeException & rtex)
{
char cErro[1024] = {0};
sprintf(cErro,"\nTradePoputBulletinThread____%s\n",rtex.what());
OutputDebugStringA(cErro);
//g_WriteLogInfo->WriteWithTime(cErro);
if (pVoid != NULL)
{
delete pVoid;
pVoid = NULL;
}
return 0;
}
catch(...)
{}
{
//pAgent->_TradeObjIdLock.UnLock();
if (pVoid != NULL)
{
delete pVoid;
pVoid = NULL;
}
return 0;
}
}


1、
string转成LPVOID
(void*)(str.c_str());
2、
LPVOID转成string
string seq = (char*)pVoid;

string seq = (char* &)pVoid;这个的区别

3、生命周期
### 线程生命周期概述 Java 中的线程生命周期是指线程从创建到结束所经历的一系列状态变化过程。这些状态的变化是由 JVM 和操作系统的线程调度机制共同决定的。以下是线程生命周期中的主要阶段及其详细说明: --- #### 1. 新建 (NEW) 阶段 当一个 `Thread` 对象被实例化时,它处于新建状态。此时,线程尚未启动,也没有任何资源分配给该线程。 - **特点**: 只有对象存在,还未调用 `start()` 方法。 - **转换条件**: 调用 `thread.start()` 方法后进入下一阶段。 - **注意事项**: 此状态下无法执行任务,因为线程并未真正开始运行[^3]。 --- #### 2. 就绪 (RUNNABLE) 阶段 一旦调用了 `start()` 方法,线程就会进入就绪状态。这意味着线程已经准备好运行,但由于 CPU 时间片可能正在其他线程上使用,因此需要等待操作系统分配 CPU 资源。 - **特点**: 线程已准备就绪,但尚未获得 CPU 执行权。 - **转换条件**: 当前线程获取到了 CPU 的使用权,则进入运行状态;或者由于某些原因(如 I/O 操作),线程可能会暂时让出 CPU 并重新回到就绪队列。 - **注意事项**: 多个线程可以在同一时刻处于 RUNNABLE 状态,具体哪个线程会被选中取决于线程调度策略[^1]。 --- #### 3. 运行 (RUNNING) 阶段 当线程获得了 CPU 使用权并开始执行其任务时,即进入了运行状态。这是线程实际工作的阶段,在此期间,线程会执行定义在其 `run()` 方法中的逻辑。 - **特点**: 线程正占用 CPU 来完成指定的任务。 - **转换条件**: 如果遇到阻塞操作(如等待锁、I/O 完成)、显式调用 `sleep()` 或 `wait()` 方法,线程将离开 RUNNING 状态转入其他状态。 - **注意事项**: 即使多个线程都在 READY 状态下排队,每次只有一个线程能够真正进入 RUNNING 状态[^4]。 --- #### 4. 阻塞 (BLOCKED/ WAITING / TIMED_WAITING) 阶段 在这个阶段,线程暂时停止执行,通常是因为等待某种外部事件的发生或满足特定条件才能继续前进。 ##### (a) BLOCKED 状态 - **特点**: 线程试图获取某个同步块上的监视器锁失败,从而进入 Blocked 状态直到锁可用为止。 - **转换条件**: 获取所需锁之后返回 Runnable 状态。 ##### (b) WAITING 状态 - **特点**: 线程无限期地等待另一个线程采取行动(比如调用 notify())。 - **典型场景**: 调用 `Object.wait()` 或 `Thread.join()` 导致线程进入 Waiting 状态。 ##### (c) TIMED_WAITING 状态 - **特点**: 类似于 Waiting 状态,但是有一个超时时间限制。 - **常见触发方式**: - `Thread.sleep(milliseconds)` - `Object.wait(timeoutMilliseconds)` - `Thread.join(timeoutMilliseconds)` --- #### 5. 终止 (TERMINATED) 阶段 当线程完成了它的全部工作或是遇到了不可恢复的错误而被迫中断时,便进入终止状态。此后,该线程不再具备活动能力,也无法再次启动。 - **特点**: 线程完全退出,释放所有相关联的资源。 - **转换条件**: 成功完成 `run()` 方法内的代码片段或者是发生致命异常导致提前退出。 - **重要提示**: 已经到达 TERMINATED 状态下的线程不可能复活再跑起来[^5]。 --- ```java public class ThreadLifecycleExample { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { System.out.println("Running..."); try { Thread.sleep(100); // Entering TIMED_WAITING state. } catch (InterruptedException e) { throw new RuntimeException(e); } synchronized(ThreadLifecycleExample.class){ try{ ThreadLifecycleExample.class.wait(); // Entering WAITING state. }catch(Exception ex){} } }); System.out.println("New State: " + thread.getState()); // NEW thread.start(); System.out.println("Runnable or Running State: " + thread.getState()); // RUNNABLE/RUNNING Thread.sleep(200); // Give time to reach sleep/wait states. System.out.println("After Sleep & Wait States: " + thread.getState()); while(thread.isAlive()){ Thread.yield(); // Yielding control back to scheduler. } System.out.println("Terminated State: " + thread.getState()); // TERMINATED } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值