创建线程有三种方式:

  1.继承Thread类
  2.实现Runnable接口
  3.使用Callable和Future创建线程

三种方式详解如下:

---------------------------------------------------------------------------

  

  1.继承Thread类创建线程类
    (1).重写run()方法,run()方法即是线程的执行体
    (2).实例化线程类
    (3).调用start()方法,启动线程

  代码示例:

public class MyThread extends Thread {
int i = 0;
public void run() {
for(; i <= 50;i++) {
System.out.println(getName() + i);
}
}
public static void main(String args[]) {
for(int i=0;i <= 50;i++) {
if(i == 10) {
MyThread myThread = new MyThread();
myThread.start();
}
}
}
}

  

  

  2.创建实现Runnable接口的线程类:

    (1)重写run()方法,run()方法是线程的执行体

    (2)创建线程类的实例,并以该实例为对象创建Thread类的实例,Thread类对象才是真正的线程对象

    (3)通过Thread对象调用start()方法,启动线程

  代码示例:

    

public class MyRunnable implements Runnable {

    private int i;
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0; i<=50;i++) {
System.out.println(Thread.currentThread().getName() + i);
}
} public static void main(String args[]) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable, "new Thread");
thread.start();
} }

  

 3.通过Callable和Future创建线程:

  (1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

  (2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值

  (3)使用FutureTask对象作为Thread对象的参数创建并启动新线程

  (4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

  代码示例:

    

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; public class CallableThread implements Callable<Integer> { @Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
int i = 0;
for(;i<=50;i++) {
System.out.println(Thread.currentThread().getName() + i);
}
return i;
} public static void main(String args[]) {
CallableThread ct = new CallableThread();
FutureTask<Integer> ft = new FutureTask<>(ct);
for(int i=0;i <= 50;i++) {
new Thread(ft,"返回线程").start();
}
try {
System.out.println("线程的返回值:" + ft.get());
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} }

  通过以上的代码实例,我们可以看到:

    基于Runnablehe和Callable接口实现的线程类比较灵活,可继承其他类,适合多个线程处理同一个资源的情况,但与此同时代码较复杂,访问当前线程时要使用Thread.currentThread()方法。

    而继承Thread实现的线程类在访问当前线程时只使用this即可访问,但因为继承了Thread类,不能再继承其他类

 

Java线程的三种方式的更多相关文章

  1. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

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

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

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

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

  4. AJPFX总结java创建线程的三种方式及其对比

    Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行 ...

  5. java创建线程的三种方式及其对照

    Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类.并重写该类的run方法,该run方法的方法体就代表了线程要完毕的任务.因此把run()方法称为运行 ...

  6. Java实现线程的三种方式和区别

    Java实现线程的三种方式和区别 Java实现线程的三种方式: 继承Thread 实现Runnable接口 实现Callable接口 区别: 第一种方式继承Thread就不能继承其他类了,后面两种可以 ...

  7. Java线程的三种实现方法

    Java多线程详解 线程简介 多任务,多线程 多任务情况中,虽然可以完成,但是实际上,多任务的完成是由一个一个小任务的完成来实现的,也就是说在执行多任务时,不是同时执行多个任务,而是一个时间段内只完成 ...

  8. Linux:结束线程的三种方式

    一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止.但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态. ...

  9. 创建线程的三种方式_Callable和Runnable的区别

    Java 提供了三种创建线程的方法 通过实现Runnable接口 通过继承Thread接口 通过Callable和Future创建线程 通过实现 Runnable 接口来创建线程 public cla ...

随机推荐

  1. mybatis-generator使用心得

    通过web service给前端返回数据 首先后台先建表, 再针对表进行CRUD的各种sql, 然鹅,现在流行做法是使用mybatis,直接xml把sql融合了,什么事都有利弊,像我这样的手写sql党 ...

  2. layui 日期插件onchange事件失效的方法

    laydate.render({ elem:'#text1',//制定元素 type:'date', //range:true,//开启左右面板 min:'2017-09-1',// max:'201 ...

  3. 解决Android Studio卡在Gradle:Resolve dependecies 'app:_debugCompile'问题

    转载: http://blog.csdn.net/callzjy/article/details/53662073 该死的破墙,我被恶心了一个晚上. 做墙的技术员,TMD的能不能上点心,至少把技术网站 ...

  4. 苹果手机marquee显示文字不全,如何解决?

    不能给marquee设定宽度,如果想只显示屏幕宽度的一部分,就给marquee外面包一个div,给外面的div设定宽度,这样就解决了文字显示不全的问题

  5. SVN的安装

    Svn服务器的安装和配置 注意,一定要切换到最高管理权限:  su root  通过这个命令就可以完成! 1.安装svn服务器端软件从镜像服务器或者YUM源下载安装SVN服务器软件:yum insta ...

  6. vuex之单向数据流

    单向数据流 State State 用来存状态.在根实例中注册了store 后,用 this.$store.state 来访问. Getters Getters 从 state 上派生出来的状态.可以 ...

  7. luffy后端之跨域corf的解决方法

    跨域CORS 我们现在为前端和后端分别设置两个不同的域名 window 系统: C:\Windows\System32\drivers\etc\host linux/mac系统: /etc/hosts ...

  8. 【Java】【6】JDK8 Stream操作整理

    摘要: 1,List<EntityOld>转换为List<EntityNew> List<EntityOld> list = oldList; List<En ...

  9. jquery解决file上传图片+图片预览

    js解决file上传图片+图片预览 demo案例中代码为js原生控制,可以根据项目的需求修改为jquery操作 <!DOCTYPE html><html lang="en& ...

  10. ThinkPHP3自动加载公共函数文件

    7d 根目录 ├─Application 应用目录 │ ├─Common 公共模块 │ │ ├─Common 公共函数文件目录 │ │ │ ├─index.html │ │ ├─Config 配置文件 ...