黑马程序员技术交流社区
标题:
线程问题求解答
[打印本页]
作者:
杨永峰
时间:
2012-5-23 12:49
标题:
线程问题求解答
下面是关于定时器的代码:
public class My extends Thread {
public static void main(String args[]) throws Exception
{
Thread t1=new My();
t1.start();
}
public void run()
{
while(true)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread");
}
}
}
复制代码
上面代码段,隔一秒输出一句thread。
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class My2 {
public static void main(String args[]) throws Exception
{
ScheduledExecutorService se=Executors.newScheduledThreadPool(1);
se.scheduleAtFixedRate(
new Runnable(){
public void run() {
System.out.println("tread");
}},
1,
1,
TimeUnit.SECONDS);
}
}
复制代码
这段代码也是隔一秒输出一句 thread
同样都完成了一种功能,有什么区别,理解的不是很透彻
作者:
杨梦宇
时间:
2012-5-23 13:18
本帖最后由 杨梦宇 于 2012-5-23 13:22 编辑
是有区别的,线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。
但是如果一个线程的时间非常长那就,就没必要用线程池了。况且还不能控制线程池中线程的开始、挂起、和中止。
楼主所说的sleep方法,并没有使线程真正的“结束”,而是在停滞状态(线程间同步的时候,用sleep,并没有释放同步锁就可以证明这一点)。
使用线程池,就好比线程池雇佣了几个工人来为池子里面的线程来服务,需要执行的时候我才来服务你,不需要我就去为别人服务或者等待。
针对你的程序,总结一句话:不用线程池,线程一直没有被终止;而使用线程池线程只有在需要的时候被运行
作者:
闾丘日月
时间:
2012-5-24 14:09
补充一下楼上的,
楼主是用的sleep方法,一旦线程死掉,就会抛出异常,程序结束
而使用单一线程池的话,线程死掉以后还会给你重新创建一个线程来接着睡。
打个比喻就是,lz需要不停的搬砖,一旦lz累了或者有其它事情,可能就不搬了,而线程池好比一个专门帮人搬砖的公司,每次派一个人来帮忙搬砖,如果那个人出什么事,立马派个新的人来接着干。
至于两者怎么用应该就看lz自己的应用场景了。
作者:
闾丘日月
时间:
2012-5-24 14:09
接着睡说快了。。接着打印
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2