线程创建简介

  1.在java中表示线程的是Thread类。无论是那种方式创建线程,本质上都是创建Thread类的对象。

  2.Thread类继承Runnable接口,且也有以Runnable作为参数的构造方法。

  3.FutureTask这个类也实现了Runnable接口,故也可以作为参数传进Thread 里面来创建线程。

线程的创建

继承Thread类

package thread;

/**
 * 继承thread类来创建线程
 *
 * @author dh
 *
 */
public class ExtendsThread extends Thread {

    public void run() {
        for (int i = 0; i 

实现Runnable接口

package thread;

/**
  • 实现 Runnable接口
  • @author dh
  • */ public class ImplementRunnable implements Runnable { private int i; public ImplementRunnable(int i) { this.i = i; } @Override public void run() {
      for (; i < 20; i++) {
          System.out.println(Thread.currentThread().getName() + "   _" + i);
      }

    }

}

实现Callable接口

package thread;

import java.util.concurrent.Callable;

/**
  • @author dh
  • */ public class ImplementCallable implements Callable { private int i; public ImplementCallable(int i) { this.i = i; } @Override public String call() throws Exception { for (; i < 20; i++) { System.out.println(Thread.currentThread().getName() + " _" + i);
      }
      return "1";

    }

}

创建线程

package thread;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
 *
 * @author dh
 *
 */
public class TestD {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExtendsThread et = new ExtendsThread();
        et.run();

        ImplementRunnable imr = new ImplementRunnable(0);
        Thread thread = new Thread(imr);
        thread.start();
        Thread thread1 = new Thread(imr);
        thread1.start();

        ImplementCallable implCallable = new ImplementCallable(1);
        FutureTask ft = new FutureTask(implCallable);
        Thread thread2 = new Thread(ft);
        thread2.start();
        System.out.println(ft.get());

    }

}
}

结果如下:

main _0
main _1
main _2
main _3
main _4
main _5
main _6
main _7
main _8
main _9
Thread-1 _0
Thread-2 _0
Thread-1 _1
Thread-2 _2
Thread-1 _3
Thread-2 _4
Thread-1 _5
Thread-2 _6
Thread-1 _7
Thread-2 _8
Thread-1 _9
Thread-2 _10
Thread-1 _11
Thread-2 _12
Thread-1 _13
Thread-2 _14
Thread-1 _15
Thread-2 _16
Thread-1 _17
Thread-2 _18
Thread-1 _19
Thread-3 _1
Thread-3 _2
Thread-3 _3
Thread-3 _4
Thread-3 _5
Thread-3 _6
Thread-3 _7
Thread-3 _8
Thread-3 _9
Thread-3 _10
Thread-3 _11
Thread-3 _12
Thread-3 _13
Thread-3 _14
Thread-3 _15
Thread-3 _16
Thread-3 _17
Thread-3 _18
Thread-3 _19
1

3种方式创建的优缺点

1.继承Thread显然有个很大的缺点,java是单继承了,如果继承了Thread那么就无法继承其他类。但是继承Thread编写简单,实现方便。

2.实现Runnable接口和Callable接口。大致一样,区别就是Callable接口的实现可以有返回值,且可以抛出显示异常。其余大致一样。
他们的优势是实现接口,那么实现类可以有其他父类,避免的Thread的问题,其次可以用一个实现了该接口的对象来创建多个线程,从而方便一些基本的资源共享,因为是同一个对象。

java线程的3种创建方式及优缺点的更多相关文章

  1. java多线程总结一:线程的两种创建方式及比较

    1.线程的概念:线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行.当程序作为一个应 ...

  2. java多线程总结一:线程的两种创建方式及优劣比较

    1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现 ...

  3. java多线程总结:线程的两种创建方式及优劣比较

    1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现 ...

  4. [转载]Java线程的两种实现方式

    转载:http://baijiahao.baidu.com/s?id=1602265641578157555&wfr=spider&for=pc 前言 线程是程序的一条执行线索,执行路 ...

  5. Thread -线程的两种创建方式

    package cn.learn.thread.Thread; /* 实现Runnable必须重写run()方法,一般推荐用Runnable实现 */ public class RunnableImp ...

  6. java线程的3种实现方式及线程池

    1 准备数据 1.1 目标 为了形象地演示线程的工作现象, 准备两个文件datas/odds.txt和datas/evens.txt, 分别存储奇数和偶数, 内容如下: odds.txt 1 3 5 ...

  7. java线程的三种实现方式

    线程实现的三种种方式: 一个是继承Thread类,实现run()方法: 一个是实现Runnable接口,实现run()方法: 一个是实现Callable接口,实现call()方法:该方式和实现Runn ...

  8. JAVA并发编程学习笔记------线程的三种创建方式

    创建线程一般有如下几个方式: 1. 通过继承Thread类来创建一个线程: /** * 步骤1:定义一个继承Thread类的子类 * 步骤2:构造子类的一个对象 * 步骤3:启动线程: * */ pu ...

  9. java多线程的两种创建方式

    方式一:继承Thread类 1.创建一个继承于Thread类的子类 2.重写Thread类的run()方法---> 将此线程执行的操作声明在run()中 3.创建Thread类的子类的对象 4. ...

随机推荐

  1. SGU 438 The Glorious Karlutka River =)(最大流)

    Description A group of Mtourists are walking along the Karlutka river. They want to cross the river, ...

  2. HDU 3726 Graph and Queries(平衡二叉树)(2010 Asia Tianjin Regional Contest)

    Description You are given an undirected graph with N vertexes and M edges. Every vertex in this grap ...

  3. svn服务器 备份,迁移,部署方案

    这次做业务迁移,要从一个云厂商迁移到某云厂商,之前每天到全备svn排到用场了,需要搭建一个全新到svn服务并要做迁移,并实现我们开发机到时时代码同步 一.svn备份有很多种,优劣都不同,百度可查,我采 ...

  4. Java中ArrayList与数组间相互转换

    在实际的 Java 开发中,如何选择数据结构是一个非常重要的问题. 衡量标准化(读的效率与改的效率) : ① Array: 读快改慢 ② Linked :改快读慢 ③ Hash:介于两者之间 实现Li ...

  5. Java 二维数组

    在 Java 中,二维数组与一维数组一样,但是不同于 C 中的二维数组: 1. 在 Java 中,二维数组可以看成是以数组为元素的数组,例如:  int a[][] = {{1,2},{3,4,5,6 ...

  6. CWnd类虚函数的调用时机、缺省实现

    MFC(VC6.0)的CWnd及其子类中,有如下三个函数: class CWnd : public CCmdTarget{    public:        virtual BOOL PreCrea ...

  7. MFC加速键

    添加的函数:    } // 解释说明    MFC对话框不自动处理加速键,你必须自己编写代码来做这件事情.为了理解弄清楚这是为什么,让我们回首Windows开发的历程,在使用C和原始的Windows ...

  8. iOS- 网络访问两种常用方式【GET & POST】实现的几个主要步骤

    1.前言 上次,在博客里谈谈了[GET & POST]的区别,这次准备主要是分享一下自己对[GET & POST]的理解和实现的主要步骤. 在这就不多废话了,直接进主题,有什么不足的欢 ...

  9. OSG学习:基本几何体绘制示例

    绘制并渲染几何体主要有如下3大步骤: 1.创建各种向量数据,如顶点.纹理坐标.颜色和法线等.需要注意的是,添加顶点数据时主要按照逆时针顺序添加, 以确保背面剔除的正确. 2.实例化一个几何体对象(os ...

  10. Qt-排序

    1.要求传入起始指针,总长度,单元素空间占用大小(sizeof(A[i])),判断函数. 判断函数参数类型为const void *,使用需要在函数内自行转换为对应类型, 返回值为整数型,升序排序时正 ...