程序大体是这样的,由主线程启动一个子线程,子线程代码如下
@Override
public void run() {
while(true){
try {
Thread.sleep(60000);
send();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void send() throws UnsupportedEncodingException{
System.out.println("心跳包-------------------------------:"+YYYYmmdd.getNow());
Collection<QQUser> qqes= SessionContex.getQQList();
Iterator<QQUser> it = qqes.iterator(); // 获得一个迭代子
while(it.hasNext()) {
QQUser qq = it.next(); // 得到下一个元素
if(qq.isLogin()){
qq.setCommand(0x58);//设置心跳包
byte[] send = (qq.getQq() + "").getBytes("UTF-8");
qq.setSend(send);
Connector connector= SessionContex.getConnector(qq.getQq());
connector.getSession().write(qq);
}
}
而子线程没有用到大规模计算切只有一个,与同步锁无关,按理说应该1分钟执行一次。运行了几个小时正常,睡觉醒了,打开屏幕锁发现最后一个1个包是刚刚打开11点左右发的,而之前一个是7点过才发送的,这之间差了几个小时,很奇怪这几个小时去哪儿了,实在想不出来,有种推测是win7锁屏幕后线程会被休眠,有这种可能吗?
日志如下
心跳包-------------------------------:20110417071548
logintimes:14
使用默认编码器 命令为:0058
encode QQ[xx] data to ip:/58.60.14.108:8000
02 21 07 00 58 04 aa 1f 67 5f e9 02 00 00 00 01
01 01 00 00 64 58 9b f9 9e 14 53 b8 ee 07 25 57
00 4f f2 4c 2d 7a 93 3e b7 fe 21 2d 7f f2 03
decode:
02 21 07 00 58 04 AA 1F 67 5F E9 00 00 00 3A C9
1C 8D D6 41 FE 01 B5 8F 04 47 0B 87 63 C8 C8 C7
87 4B C6 AB E0 A4 7C 0D 2C AD C0 24 BA 03 03
address:/58.60.14.108:8000
decode loginTimes:14. command: 58
logintimes:14
decode:
02 21 07 00 17 E1 B0 1F 67 5F E9 4C 10 01 8B A0
E5 9B 07 9B B9 0D 90 55 00 26 FA 36 B7 56 A1 69
68 DC C3 A6 F6 06 8F 14 08 82 01 22 A7 EE 2F 4C
FD DB A7 5E 9E 99 03
address:/58.60.14.108:8000
decode loginTimes:14. command: 17
key:687269684b7676646663536866633356
17尝试按群消息转换出错了
logintimes:14
encode QQ[xx] data to ip:/58.60.14.108:8000
02 21 07 00 17 e1 b0 1f 67 5f e9 02 00 00 00 01
01 01 00 00 64 58 ac c1 c7 4f ec 7a 41 4b 6f 2b
0f 47 71 b4 20 0a b2 62 83 fe 96 ad fc ed 40 55
49 92 eb a5 85 dd 03
心跳包-------------------------------:20110417071648
logintimes:14
使用默认编码器 命令为:0058
encode QQ[xx] data to ip:/58.60.14.108:8000
02 21 07 00 58 25 e8 1f 67 5f e9 02 00 00 00 01
01 01 00 00 64 58 45 a8 07 72 9b 5b 3f 60 18 e3
64 e8 21 1a e4 79 42 94 27 ac c0 d2 c7 d1 03
decode:
02 21 07 00 58 25 E8 1F 67 5F E9 00 00 00 66 72
CC 83 FF 8B 5B D1 D4 67 EB 8C 1F 3E A1 9C 37 E5
68 0B 32 2F DA 23 4E 1F 40 0A 5D 63 4D 48 03
address:/58.60.14.108:8000
decode loginTimes:14. command: 58
logintimes:14
decode:
02 21 07 00 17 E1 B1 1F 67 5F E9 4C 10 01 9D 2F
8A D8 15 B6 FE A9 45 FF 18 33 E8 35 A6 73 B4 23
25 4D 30 EE 89 6D 90 16 3D 49 6D 30 B9 DF 90 55
F6 71 27 DE FE 16 03
address:/58.60.14.108:8000
decode loginTimes:14. command: 17
key:687269684b7676646663536866633356
17尝试按群消息转换出错了
logintimes:14
encode QQ[xx] data to ip:/58.60.14.108:8000
02 21 07 00 17 e1 b1 1f 67 5f e9 02 00 00 00 01
01 01 00 00 64 58 1c e9 12 41 b6 c6 f6 96 08 25
46 1a 59 32 25 10 29 a0 e8 4c 4f 50 f7 54 16 11
73 8b 5f 0a 80 e9 03
心跳包-------------------------------:20110417114337
logintimes:14
使用默认编码器 命令为:0058
encode QQ[xx] data to ip:/58.60.14.108:8000
02 21 07 00 58 04 dd 1f 67 5f e9 02 00 00 00 01
01 01 00 00 64 58 f1 aa 0a ce 1a f0 b4 c9 f5 28
3a 92 43 16 7e 32 53 84 e1 94 ce bb 99 f6 03
分享到:
相关推荐
解决这个问题的一个方法是调整锁的获取顺序,确保所有线程都按照相同的顺序获取锁,打破循环等待条件。 `Count3Quit.java`可能是一个基于计数器的示例,其中可能存在多个线程试图同时修改计数器。如果不正确地同步...
- 本问题中,可能使用`synchronized`来控制两个线程的交替执行,确保一个线程在完成其任务后释放锁,另一个线程才能获取并继续执行。 2. **线程通信**: - Java提供了`wait()`、`notify()`和`notifyAll()`方法...
10. **线程异常处理**:在多线程环境中,一个线程的异常可能会导致其他线程的中断。因此,理解如何在多线程中处理异常是至关重要的。 常见问题包括但不限于: 1. **线程安全问题**:如内存泄漏、资源争抢、数据...
为了解决这个问题,我们需要利用C#中的多线程机制,特别是委托和事件。委托在C#中是一种类型安全的函数指针,可以用于在多线程之间传递方法调用。通过定义委托,我们可以将耗时的任务封装起来,然后在线程中执行。...
总的来说,“Paintawe”的多线程写入例程是一个实践多线程编程的好教材,可以帮助开发者深入理解如何在C++中有效地利用多线程,提升程序性能,同时掌握解决并发问题的关键技能。通过阅读源代码和说明文档,开发者...
在案例中,可能涉及到上述的一个或多个知识点,比如创建线程、实现线程间通信、处理同步问题,或者利用并发工具类进行线程管理。由于案例是不完整的,具体的实现细节和问题还需要根据源代码来分析和补充。对于初学者...
- 创建线程:使用易语言的“创建线程”命令,传入一个子程序作为线程要执行的代码,即可创建一个新的工作线程。 - 线程同步:为了防止多个线程同时访问同一资源引发的问题,易语言提供了“锁定”和“解锁”命令...
而在多线程环境下,一个应用程序可以同时执行多个不同的线程,即并发执行多个任务。这样可以提高程序的效率,特别是在处理I/O密集型或计算密集型任务时,多线程可以使CPU资源得到充分利用,避免空闲等待。 在“多...
在IT行业中,多线程是程序设计中的一个重要概念,尤其在服务器端开发、高并发处理以及实时系统中显得尤为重要。本资源包“多线程相关资料”提供了关于多线程编程的详细知识,包括理论解释和实践代码示例,帮助开发者...
在C#编程中,多线程是一个核心概念,特别是在现代计算环境中,它允许程序同时执行多个任务,提高程序效率和响应性。以下是对标题和描述中提到的C#多线程知识点的详细解释: 1. **线程创建**:C#提供多种方式创建...
此外,Python的全局解释器锁(GIL)限制了在同一时刻只有一个线程执行Python字节码,这可能会影响多线程的性能。在CPU密集型任务中,多线程可能无法充分利用多核处理器的优势。在这种情况下,可以考虑使用多进程(`...
为了解决这个问题,开发者可以利用多线程技术来提高程序的执行效率。"php-多线程扩展"正是这样一个工具,它允许PHP代码在C语言级别上实现多线程功能,从而提升应用程序的性能。 这个扩展是用C语言编写的,因为它...
线程池是一种优化线程创建和销毁的机制,它预先创建一组线程,当有任务需要执行时,线程池会分配一个空闲线程而不是创建新的。`ThreadPool.QueueUserWorkItem`方法用于向线程池提交任务。 六、异步编程与任务并行库...
一个标准的Java应用程序至少会有一个线程,即主线程,用于执行程序的主要逻辑。通过创建多个线程,可以实现并发执行任务,提高程序的运行效率和响应速度。线程在Java中可以通过两种方式创建:继承`Thread`类或者实现...
当一个线程正在执行 `addMethod()` 时,其他试图进入该方法的线程将被阻塞,直到当前线程完成方法的执行。这样,`number` 的递增操作就不会被多个线程同时执行,从而避免了数据不一致。 4. **基本数据类型的线程...
总结来说,"Nio多线程CS收发信息问题"涉及到在Java NIO环境下,如何构建一个多线程、高并发的客户端-服务器通信系统,并解决在这个过程中可能遇到的各种挑战。通过理解NIO的核心概念,合理设计线程管理和异常处理...
线程同步的一个经典问题就是死锁,它发生在两个或更多线程相互等待对方释放资源,从而导致所有线程都无法继续执行。避免死锁的关键在于合理设计资源获取顺序,以及使用超时和死锁检测机制。 在"ThreadSample"压缩包...
它可以用于方法或代码块,确保同一时间只有一个线程能执行特定代码。 2. wait()、notify()和notifyAll():这些方法在Object类中定义,用于线程间的通信和协作。它们必须在同步环境中使用,以避免死锁。 3. Lock接口...