比如我想一个线程在某个时刻中止,从而释放线程资源,在需要的时候再次启动它,并且要恢复栈的现场。可否做到?

解决方案 »

  1.   

    当一下线程wait时,它就释放了资源。然后该线程需要继续的时后,其它线程 notify它。
      

  2.   

    线程栈有jvm自动维护,堆中数据要自己去维护,这也就是常说的线程安全同时线程不管理资源,进程才管理资源
      

  3.   

    我说下我想做什么事情吧。现在有一个网络程序,其中是用到多线程来处理多连接,当一个连接处理完之后释放连接。而这样有个最大的缺陷就是每个线程中间会请求网络上的另外的服务,可能需要几秒,而这几秒这个线程是处于wait的状态。这样很浪费,也会占用CPU时间片。当线程超过500的时候性能很糟糕。我希望线程在这几秒被还给线程池,而当外部服务数据到达时再启动其他线程并恢复之前线程的栈继续执行。这样可以大大提高服务器的性能
      

  4.   

    你这完全是业务的需求,java线程本身是不需要保存栈信息的,因为java一个线程对应一个java栈,java栈中存放着操作数、局部变量和PC计数器,所以切换线程的时候不会有什么干扰
    而你的要求,与操作系统,jvm的线程切换完全不搭界,完全是一种业务需求,任何语言也不会给你提供这样的功能另外,当线程wait的时候,是不会占用CPU时间的!如果说500线程的时候性能就糟糕了,那么我建议查查其他原因。很有可能不是线程wait导致系统的瓶颈
      

  5.   


    你这个思路不能提高服务器的性能,如果是必须请求外部资源,那瓶颈还是在外部服务提供者那里,只有外部获得资源后才能完成服务器的全部流程,所以你把线程放回线程池不能解决问题,反而要增加一个线程同步点(在外部服务返回结果后,重新交给线程池处理),系统的复杂性也会变得复杂。在线程等待外部服务返回过程中,如果是同步操作,这时线程出于挂起状态,等待IO返回,在结果返回后,线程会获得CPU时间片继续执行,如果是异步操作,那就继续往下执行(这种情况和你的要求不符合)。正常情况下,按照CPU的个数开启线程数,本人一般是开启CPU个数*5,线程的切换是有资源消耗的(压栈、弹栈等操作),不是开的越多越好
      

  6.   

    一个进程使用超过 500 个的线程,那真够可以的!操作系统对于每个进程所能使用的线程数是有限制的,Windows 大概是 2000 个左右,Linux 由于线程栈空间较大,因此在 1000 个左右。在 Windows 平台上每个线程需要占用 1MB 的内存空间,那也就是说 500 个线程需要占用掉 500MB 的内存。建议采用 NIO 方式,外部调用使用线程池,并且控制好阻塞队列的长度,在外部调用很耗时时进行等待是必要的。你要做的是要实现一个队列,一个性能优良且安全的队列实现非常复杂,JMS 就是队列应用之一。