首页 新闻 会员 周边

Thread多线程问题

0
悬赏园豆:5 [已解决问题] 解决于 2013-03-27 11:37

网络上的很多多线程例子,在一个方法里循环执行Thread.Start()之后,跳出方法并没有把原先开启的线程关闭,如果是socket监听,来一个请求就Start一个线程,会不会系统崩溃?还是系统自动把Start出来的线程关闭?还是有其他方法去销毁从别的方法内部创建的线程?

阿摩罗识的主页 阿摩罗识 | 初学一级 | 园豆:196
提问于:2013-03-27 10:43
< >
分享
最佳答案
0

    很想给你讨论一下线程的知识..首先你要知道线程的生命周期.新建(new thread)---就绪(runnable)---运行(running)--死亡(dead)这是大致的周题,当然在运行到死亡期间还会有堵塞了等等情况..

1线程死亡结束: 当线程执行完毕后,线程就进入了死亡状态,这时线程是不可能在进入就绪状态等待执行的.线程如果执行完run方法就自动死亡了.

2对于socket编程使用多线程时,如果来一个请求就start一个线程是会造成内存开销太大导致内存溢出,而导致系统崩溃.这时候你就应该用到线程池.可以参考以下代码:

 1 class NetworkService implements Runnable {
 2     private final ServerSocket serverSocket;
 3     private final ExecutorService pool;
 4 
 5     public NetworkService(int port, int poolSize)
 6         throws IOException {
 7       serverSocket = new ServerSocket(port);
 8       pool = Executors.newFixedThreadPool(poolSize);
 9     }
10  
11     public void run() { // run the service
12       try {
13         for (;;) {
14           pool.execute(new Handler(serverSocket.accept()));
15         }
16       } catch (IOException ex) {
17         pool.shutdown();
18       }
19     }
20   }
21 
22   class Handler implements Runnable {
23     private final Socket socket;
24     Handler(Socket socket) { this.socket = socket; }
25     public void run() {
26       // read and service request on socket
27     }
28  }这样创建固定数量的线程,放入线程次中,就好比我们准备好了比如五个接待人员去接待n多个客户,当一个客户来了的时候就去线程次里面看有没有闲着的接待人员,如果有的话就让他去接待,如果没有就说明五个人都在接待客户了,那该客户就会处于等待中,当接待的一个客户走了,就会把该线程丢回线程次中,让去接待另一个客户.
3当程序run方法中自然结束时候,线程就被关闭了,
4如果你想销毁其他方法中创建的线程那就得用到线程间通信了,
收获园豆:3
雨中雷 | 菜鸟二级 |园豆:274 | 2013-03-27 11:33

谢谢解答

阿摩罗识 | 园豆:196 (初学一级) | 2013-03-27 11:36
其他回答(2)
0

Thread会自动销毁,当然频繁创建和销毁是损耗性能的。

你可以使用ThreadPool.Queue……()来创建多线程程序,这个类帮你管理线程,不用你去创建,他根据内部资源进行创建,缓存,重用,销毁。

收获园豆:2
滴答的雨 | 园豆:3660 (老鸟四级) | 2013-03-27 11:10

python中的功能实现用的restful的接口,怎么实现多线程啊

支持(0) 反对(0) 奈何技术不达标 | 园豆:80 (初学一级) | 2019-12-02 14:56
0

你所产生的thread,其实最后都是由操作系统来控制

chenping2008 | 园豆:9836 (大侠五级) | 2013-03-27 12:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册