黑马程序员技术交流社区

标题: 线程执行问题 [打印本页]

作者: 薄炳鑫    时间: 2012-6-23 20:58
标题: 线程执行问题
本帖最后由 薄炳鑫 于 2012-6-23 22:35 编辑

在交通灯管理系统中,线程的执行用了这个Executors这个类的一些方法如:
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){});
但是毕老师在讲线程的时候,执行线程是用下面的两种方式。
一种的是继承Thread方法,通过start()方法启动线程。
另外一种是通过实现Runnable接口,通过实现Runnable接口类的对象传递给Thread的构造器。然后通过start()方法来调用。
我想知道第一种和后面的两种有什么区别,哪个更好?还是根据一定的需求来选着相应的方法。
作者: whocases    时间: 2012-6-23 21:57
Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限;在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
①避免继承的局限,一个类可以继承多个接口。
②适合于资源的共享
作者: 薄炳鑫    时间: 2012-6-23 22:00
whocases 发表于 2012-6-23 21:57
Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程 ...

这个我明白,我想问的是
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){});
和下面两种比较的优势和不足。在开发中,哪种比较常见?
作者: 闾丘日月    时间: 2012-6-23 22:05
一个是线程池,一个是线程,完全不同的两个东西,开发中就我推断是后一种比较常见,毕竟concurrent包的东西太过深奥,而且不是所有的地方都有线程安全问题
当然玩多线程的同步和通信,基本上用concurrent包里的那一套了,那套api是一位java语言的大牛搞出来的,能看懂的话估计多线程无往不利。
作者: whocases    时间: 2012-6-23 22:07
薄炳鑫 发表于 2012-6-23 22:00
这个我明白,我想问的是
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(ne ...

newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
作者: 薄炳鑫    时间: 2012-6-23 22:28
whocases 发表于 2012-6-23 22:07
newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程 ...

这个是不是和数据库连接池的那个概念一样。
始终存在的一个线程运行对象,当运行结束后也存在一个空的运行对象?
作者: 黄奕豪    时间: 2012-6-24 00:11
线程池是JDK1.5后出现的新特性,是对线程的封装,同一个线程池的线程只能唤醒同一个线程池中的线程,这个视频中稍微说到了一点,开发中肯定是利用新特性了!!利用线程池可以一次创建一池10个线程,利用老方法你还得new10个呢!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2