黑马程序员技术交流社区

标题: Java中实现线程的3种方式的区别 [打印本页]

作者: 经济    时间: 2015-6-3 10:19
标题: Java中实现线程的3种方式的区别
一、前言
最近学习了Java的线程技术,感觉收获很多,现在我就来分享一下Java中实现线程的3种方式,由于本人技术有限,文中描述可能会有些不合理的地方,欢迎大家踊跃指出。
二、正文
(1)实现线程的第一种方式
          A:声明一个类继承Thread类。
          B:重写其中的Run()方法。
          C:初始化A声明的对象,并调用start()方法,那么这时,你就成功创建并开启一个线程。
(2)实现线程的第二种方式
          A:声明一个类实现Runable接口。
          B:重写其中的run()方法。
          C:实例化A中声明的类。
          D:将C中创建的对象传入Thread构造函数中含有Runable接口做参数中,并创建其实例。
          E:调用D中创建的实例的start()方法,你将成功开启一个线程。
(3)创建线程的第三种方式
          A:声明一个类实现Callable接口,重写其中的Call()方法。
          B:声明一个线程池对象(ThreadPoolExecutor)。
          C:创建A中类的一个实例。
          D:调用B中创建对象的submit(Callable task)方法,那么这时,你将成功创建并开启一个线程。
三、总结
创建线程有3中方式,个人感觉第二种好,因为它可以将资源的处理和业务逻辑分开,提高了系统的扩展性,至于第三种,由于本人技术有限,目前还没有见到太多的地方利用。


作者: 经济    时间: 2015-6-3 10:27
kikt 发表于 2015-6-3 10:23
Runnable接口 不要写错了名字哦

嗯,谢谢,没注意到
作者: 星辉祝愿    时间: 2015-6-3 12:38
居然还有第三种实现方式,第一次见到喔!
作者: 嘎路的米    时间: 2015-6-3 15:46
第三种方式怎么都没见到- -,难道是我学了忘记了吗
作者: 经济    时间: 2015-6-3 16:11
星辉祝愿 发表于 2015-6-3 12:38
居然还有第三种实现方式,第一次见到喔!

第三种不常用,但却是存在,jdk1.5提供的线程池中,提供了了方法,
作者: 经济    时间: 2015-6-3 16:12
星辉祝愿 发表于 2015-6-3 12:38
居然还有第三种实现方式,第一次见到喔!

可以了解下,面试时,可以加分哈,

作者: 郝民杰    时间: 2015-6-3 16:47
第三种方式不了解,不过感谢楼主总结,学习了。
作者: Always,    时间: 2015-6-3 16:51
感谢楼主总结、
作者: richaled    时间: 2015-6-4 09:28
学习了,还有第三种方式
作者: as604049322    时间: 2015-6-4 10:27
信不信用定时器还能实现第四种???(开玩笑的,开发绝不能用定时器实现线程)
  1. package junit.test;

  2. import java.util.Date;
  3. import java.util.Timer;
  4. import java.util.TimerTask;
  5. import java.util.concurrent.atomic.AtomicInteger;

  6. public class TestTimer {
  7.         public static void main(String[] args) {
  8.                 final AtomicInteger i=new AtomicInteger(100);
  9.                
  10.                 new Timer().schedule(new TimerTask() {
  11.                         @Override
  12.                         public void run() {
  13.                                 while(i.intValue()>0){
  14.                                         System.out.println(Thread.currentThread().getName()
  15.                                                         +":"+i.getAndDecrement());
  16.                                 }
  17.                         }
  18.                 }, new Date());
  19.                
  20.                 new Timer().schedule(new TimerTask() {
  21.                         @Override
  22.                         public void run() {
  23.                                 while(i.intValue()>0){
  24.                                                 System.out.println(Thread.currentThread().getName()
  25.                                                                 +":"+i.getAndDecrement());
  26.                                 }
  27.                         }
  28.                 }, new Date());
  29.                
  30.                 while(i.intValue()>0){
  31.                         System.out.println(Thread.currentThread().getName()
  32.                                         +":"+i.getAndDecrement());
  33.                 }
  34.         }
  35. }
复制代码


作者: 经济    时间: 2015-6-4 10:30
as604049322 发表于 2015-6-4 10:27
信不信用定时器还能实现第四种???(开玩笑的,开发绝不能用定时器实现线程)

...

信,我其中一个帖子,就是用定时器,定时删除文件夹下的全部内容
作者: 志行    时间: 2015-6-4 10:46
好厉害 都是大神啊
作者: 经济    时间: 2015-6-4 10:51
志行 发表于 2015-6-4 10:46
好厉害 都是大神啊

好好跟着老师视频学习,这都很简单,加油,:)




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