转自:http://www.chinaitlab.com/Java/line/942440.html  

编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互。一般有三种方法,Thread,Runnable,Callable.

  Runnable和Callable的区别是,

  (1)Callable规定的方法是call(),Runnable规定的方法是run()。

  (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得

  (3)call方法可以抛出异常,run方法不可以

  (4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。

  1、通过实现Runnable接口来创建Thread线程:

  步骤1:创建实现Runnable接口的类:

  class SomeRunnable implements Runnable

  {

  public void run()

  {

  //do something here

  }

  }

  步骤2:创建一个类对象:

  Runnable oneRunnable = new SomeRunnable();

  步骤3:由Runnable创建一个Thread对象:

  Thread oneThread = new Thread(oneRunnable);

  步骤4:启动线程:

  oneThread.start();

  至此,一个线程就创建完成了。

  注释:线程的执行流程很简单,当执行代码oneThread.start();时,就会执行oneRunnable对象中的void run();方法,

  该方法执行完成后,线程就消亡了。

  2、与方法1类似,通过实现Callable接口来创建Thread线程:其中,Callable接口(也只有一个方法)定义如下:

  public interface Callable<V>

  {

  V call() throws Exception;

  }

  步骤1:创建实现Callable接口的类SomeCallable<Integer>(略);

  步骤2:创建一个类对象:

  Callable<Integer> oneCallable = new SomeCallable<Integer>();

  步骤3:由Callable<Integer>创建一个FutureTask<Integer>对象:

  FutureTask<Integer> oneTask = new FutureTask<Integer>(oneCallable);

  注释:FutureTask<Integer>是一个包装器,它通过接受Callable<Integer>来创建,它同时实现了Future和Runnable接口。

  步骤4:由FutureTask<Integer>创建一个Thread对象:

  Thread oneThread = new Thread(oneTask);

  步骤5:启动线程:

  oneThread.start();

  至此,一个线程就创建完成了。

  3、通过继承Thread类来创建一个线程:

  步骤1:定义一个继承Thread类的子类:

  class SomeThead extends Thraad

  {

  public void run()

  {

  //do something here

  }

  }

  步骤2:构造子类的一个对象:

  SomeThread oneThread = new SomeThread();

  步骤3:启动线程:

  oneThread.start();

  至此,一个线程就创建完成了

java 创建线程的三种方法Callable,Runnable,Thread比较及用法的更多相关文章

  1. java创建线程的三种方法

    这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析. 通过三种方法可以创建java线程: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callab ...

  2. Java创建线程的三种方法比较

    一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别 (1)Callable规定的方法是call(),Runnable规定的方法是run(). ...

  3. Java并发编程(二)创建线程的三种方法

    进程与线程 1.  进程 进程和代码之间的关系就像音乐和乐谱之间的关系一样,演奏结束的时候音乐就不存在了但乐谱还在:程序执行结束的时候进程就消失了但代码还在,而计算机就是代码的演奏家. 2. 线程 线 ...

  4. 《Java多线程面试题》系列-创建线程的三种方法及其区别

    1. 创建线程的三种方法及其区别 1.1 继承Thread类 首先,定义Thread类的子类并重写run()方法: package com.zwwhnly.springbootaction.javab ...

  5. (转)Java结束线程的三种方法

    背景:面试过程中问到结束线程的方法和线程池shutdown shutdownnow区别以及底层的实现,当时答的并不好. Java结束线程的三种方法 线程属于一次性消耗品,在执行完run()方法之后线程 ...

  6. Java结束线程的三种方法(爱奇艺面试)

    线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...

  7. Java并发编程:Java创建线程的三种方式

    目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...

  8. java创建线程的三种方式及其对比

    第一种方法:继承Thread类,重写run()方法,run()方法代表线程要执行的任务.第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务.第三种方法:实现c ...

  9. Java创建线程的三种主要方式

    Java创建线程的主要方式 一.继承Thread类创建 通过继承Thread并且重写其run(),run方法中即线程执行任务.创建后的子类通过调用 start() 方法即可执行线程方法. 通过继承Th ...

随机推荐

  1. Netty系列之Netty高性能之道

    转载自http://www.infoq.com/cn/articles/netty-high-performance 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Ne ...

  2. WinSCP无法连接 ubuntu 的解决方法

    ubuntu默认不安装sshd服务 需要sudo apt-get install ssh 你可以在ubuntu本机ssh localhost测试是否成功安装了ssh 因为WinSCP是基于ssh的sf ...

  3. Android 大图片预览ViewPager

    项目gitHub地址:  https://github.com/bm-x/PhotoView 个人项目gitHub地址:  https://github.com/anan03/ananwork/tre ...

  4. Eclipse不显示项目栏

    Window>show view>package或者Window>show view>Other...  在弹出的对话框中搜索"Package".

  5. 一个简单的loading,纯属自娱自乐

    /// <reference path="/scripts/js/jquery.min.js" /> var zsw = { loading: function (im ...

  6. [SAP ABAP开发技术总结]ABAP调优——代码优化

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. 【转载】推荐5款超实用的.NET性能分析工具

    来源:http://www.csdn.net/article/2012-11-23/2812174-5-Good-and-useful-.NET-Profilers 虽然.NET框架号称永远不会发生内 ...

  8. 不完全解决Android微信HTML5 播放视频的问题(不显示控制条,可交互)

    首先你需要知道以下内容: http://ad.weixin.qq.com/learn/2-3-3--%E9%80%9A%E7%94%A8%E5%BA%93 这是微信为广告商开放的API,我一直认为只有 ...

  9. LMAX Disruptor—多生产者多消费者中,消息复制分发的高性能实现

    解决的问题 当我们有多个消息的生产者线程,一个消费者线程时,他们之间如何进行高并发.线程安全的协调? 很简单,用一个队列. 当我们有多个消息的生产者线程,多个消费者线程,并且每一条消息需要被所有的消费 ...

  10. a标签的作用

    a标签的hover,active,target,visited等伪类在所有浏览器中是兼容的,而其他元素的这些伪类并不全兼容:   a标签本身是跳转页面的,把跳转的地址写在href这个属性中, (1)不 ...