刚看了一个 java中线程到底什么时候启动 的帖子小弟不才谈谈个人对java线程的几点看法。
线程是一个很有意思的东西。
在线程方面我大概经历了这么几个阶段。
第一个阶段 业务驱动线程,就是有业务马上开辟线程然后去处理业务,这中处理方式线程是不受控制的,创建了以后线程怎么走我也不知道。且让它自生自灭吧。不行了就内存溢出。
第二个阶段 创建了一个线程池,线程的个数是受控制的,终于不会内存溢出了。但是在现场非安全结束或者没有线程的情况下处理起来相当麻烦。基本上这时候去处理也是多余的。
第三个阶段 程序一开始就创建线程,让线程去监听队列,业务上队列,线程去抓业务然后去跑,处理完了继续回来监听。当然这里并非所有的线程都在监听队列。具体的实现可以参考LF线程模型。 但是LF线程模型如果直接拿来使用也是有点问题的。在这里我推荐使用JAVA的回调,保证线程的绝对安全。
对于多线程的应用我想说以下几个注意的地方:
第一 并非越多线程并发越好,你要考虑你的数据库连接是否够用,计算机资源使用够用等。如果你创建100个线程 每个线程进行一次数据库访问,那么你能同时提够100个连接吗?
第二 对于第三种模型建议在业务逻辑的实现中加上克隆,不要出现多个线程引用同一个对象的情况。要不然你会发现一个任务可能跑了很多次,而有的任务一次也没有跑。
第三 尽量不要再多线程中出现一些不可预测的逻辑,如果不能避免建议完善你的异常处理。业务逻辑的回调接口一定要能抛出业务不能正常结束的异常,要不然你这条线程很可能就会因为异常而永远挂起。这是很可怕的。
第四 对于有队列的线程(第三个阶段) 你要注意队列中是否才相同的任务(同一任务发生两次,这个对于定时任务是很经常见的),如果有那么会造成浪费。
第五 共享资源的控制,我虽然不推荐在多线程中出现共享资源,但逼不得已的时候切记要保护好你的共享资源。
最后说一下,我认为好的线程是存活在沙盒中的,绝对安全的,不要业务去驱动线程,应该是线程驱动业务。
就这么多了。
线程是一个很有意思的东西。
在线程方面我大概经历了这么几个阶段。
第一个阶段 业务驱动线程,就是有业务马上开辟线程然后去处理业务,这中处理方式线程是不受控制的,创建了以后线程怎么走我也不知道。且让它自生自灭吧。不行了就内存溢出。
第二个阶段 创建了一个线程池,线程的个数是受控制的,终于不会内存溢出了。但是在现场非安全结束或者没有线程的情况下处理起来相当麻烦。基本上这时候去处理也是多余的。
第三个阶段 程序一开始就创建线程,让线程去监听队列,业务上队列,线程去抓业务然后去跑,处理完了继续回来监听。当然这里并非所有的线程都在监听队列。具体的实现可以参考LF线程模型。 但是LF线程模型如果直接拿来使用也是有点问题的。在这里我推荐使用JAVA的回调,保证线程的绝对安全。
对于多线程的应用我想说以下几个注意的地方:
第一 并非越多线程并发越好,你要考虑你的数据库连接是否够用,计算机资源使用够用等。如果你创建100个线程 每个线程进行一次数据库访问,那么你能同时提够100个连接吗?
第二 对于第三种模型建议在业务逻辑的实现中加上克隆,不要出现多个线程引用同一个对象的情况。要不然你会发现一个任务可能跑了很多次,而有的任务一次也没有跑。
第三 尽量不要再多线程中出现一些不可预测的逻辑,如果不能避免建议完善你的异常处理。业务逻辑的回调接口一定要能抛出业务不能正常结束的异常,要不然你这条线程很可能就会因为异常而永远挂起。这是很可怕的。
第四 对于有队列的线程(第三个阶段) 你要注意队列中是否才相同的任务(同一任务发生两次,这个对于定时任务是很经常见的),如果有那么会造成浪费。
第五 共享资源的控制,我虽然不推荐在多线程中出现共享资源,但逼不得已的时候切记要保护好你的共享资源。
最后说一下,我认为好的线程是存活在沙盒中的,绝对安全的,不要业务去驱动线程,应该是线程驱动业务。
就这么多了。