Java创建线程有两种方法,一种是继承Thread,另一种实现Runnable或Callable接口。

一,继承Thread

public class APP {

    public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
int i = 0;
while (i < 100) {
System.out.println(i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
thread.start();
}
}

上述例子通过重写Thread的run方法,来定时输出i的值,但是要主要Thread的run方法仅仅是个普通的方法,必须要通过调用start方法才能创建线程去执行run方法,直接调用run就没有线程的创建了。

二,实现Runnable或Callable接口来创建线程。

这两个接口的实现只能是变成一个普通的类,要创建线程都必须要通过其他相关类开启的。

这两个接口最大的区别:Callable有返回值且能抛出受检测异常,而Runnable没有返回值也无法抛出受检测异常;

1,对于Runnable接口来说,

  要通过它来创建线程的的方法有两种,一种是通过Thread,另一种是通过Executor

public class APP {

    public static void main(String[] args) {

        class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("start -> "
+ Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end -> " + Thread.currentThread().getName());
} } Thread thread = new Thread(new MyRunnable());
thread.start(); Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new MyRunnable());
}
}

2,对于Callable接口来说,

  要通过它来创建线程的的方法有两种,一种是通过Thread,另一种是通过ExecutorService,但是都要同时借助于Future接口来实现对Callable返回值的相关控制。这里的ExecutorService接口是继承了Executor接口的,它增加了一些功能,大家可以点开源码看看就知道,而实例化都是通过Executors类的静态方法来实现的。

2.1 通过Thread去创建

  由于Thread只能接受Runnable所以要想通过Thread去创建Callable线程,还要再借助一个即继承了Callable接口也继承了Runnable接口的类,这个类就是FutureTask。

2.2 通过ExecutorService去创建

  由于ExecutorService天然支持Callable接口,所以直接submit就可以了。

public class APP {

    public static void main(String[] args) throws Exception {

        class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
Thread.sleep(3000);
System.out.println("end");
return 200;
}
} ExecutorService es = Executors.newCachedThreadPool();
Future<Integer> future = es.submit(new MyCallable());
System.out.println("when ExecutorService -> " + future.get()); FutureTask<Integer> task = new FutureTask<Integer>(new MyCallable());
Thread thread = new Thread(task);
thread.start();
System.out.println("when Thread ->" + task.get());
}
}

备注:

Future的get方法是线程阻塞的,直到Callable的call()方法返回值为止。

再次提醒创建线程不要直接调用run方法。

如果发现理解不了,最好点进去看看源码。

Java再学习——线程之创建的更多相关文章

  1. java 添加一个线程、创建响应的用户界面 。 演示示例代码

    javajava 添加一个线程.创建响应的用户界面 . 演示示例代码 来自thinking in java 4 21章  部分的代码  夹21.2.11 thinking in java 4免费下载: ...

  2. Java多线程之线程的创建

    好久没有更博客了,最近一直在忙工作的事情.现在终于空下来了,这2天会抓紧时间整理多线程和socket,把JavaSE结束掉. 关于多线程,首先会涉及到哪些东西呢?首先要了解线程,为什么要使用线程,线程 ...

  3. Java基础学习 —— 线程

    线程: 多线程的好处:解决了在一个进程中同时执行多个任务代码的问题. 自定义线程的创建方式: 1.自定一个类继承thread类,重写thread的run方法 吧自定义线程的任务代码写在run方法内,创 ...

  4. Java再学习——停止一个正在运行的线程

    关于这个问题,先了解一下Thread类方法中被废弃的那些方法.suspend(), resume(),stop()/stop(Throwable obj),destroy() 首先,stop(Thro ...

  5. Java再学习——随机面试题

    1.final, finally, finalize的区别 final—是修饰符,可以修饰变量.方法和类. final类不能再派生出新的子类即不可当父类: final变量必须在声明时给定初值或在构造方 ...

  6. Java基础-多线程-①线程的创建和启动

    简单阐释进程和线程 对于进程最直观的感受应该就是“windows任务管理器”中的进程管理: (计算机原理课上的记忆已经快要模糊了,简单理解一下):一个进程就是一个“执行中的程序”,是程序在计算机上的一 ...

  7. Java再学习——栈(stack)和堆(heap)

    一.内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们 ...

  8. Java再学习——CopyOnWrite容器

    一,定义 CopyOnWrite容器即写时复制的容器.通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完 ...

  9. Java再学习——关于ConcurrentHashMap

    ConcurrentHashMap提供了和Hashtable以及SynchronizedMap中所不同的锁机制. 1,在并发方面, ConcurrentHashMap提供了好得多的并发性.多个读操作几 ...

随机推荐

  1. 一起学习 微服务(MicroServices)-笔记

    笔记 微服务特性: 1. 小 专注与做一件事(适合团队就是最好的) 2. 松耦合 独立部署 3. 进程独立 4. 轻量级通信机制 实践: 1. 微服务周边的一系列基础建设 Load Balancing ...

  2. linux du命令: 显示文件、目录大小

    介绍:du命令用于显示指定文件(夹)在磁盘中所占的空间信息.假如指定的文件参数实际上是一个目录,就要计算该目录下的所有文件.假如 没有提供文件参数,执行du命令,显示当前目录内的文件占用空间信息. 语 ...

  3. #ifdef __cplusplus

    转自:http://www.2cto.com/kf/201302/191822.html #ifdef __cplusplus,一般用于将C++代码以标准C形式输出(即以C的形式被调用),这是因为C+ ...

  4. 基于LDA对关注的微博用户进行聚类

    转自:http://www.datalab.sinaapp.com/?p=237 最近看了LDA以及文本聚类的一些方法,写在这里算是读书笔记.文章最后进行了一个小实验,通过爬取本人在微博上关注的人的微 ...

  5. mongodb的查询方式与sql语句对比

    下面是sql和Mongodb对应的一些语法: SQL Statement Mongo Query Language Statement CREATE TABLE USERS (a Number, b ...

  6. 5.迪米特法则(Law Of Demeter)

    1.定义 狭义的迪米特法则定义:也叫最少知识原则(LKP,Least Knowledge Principle).如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中的一个类需要 ...

  7. JPA一对多和多对一关系

    1-m:多的一方为关系维护端,关系维护端负责外键纪录的更新,关系被维护端没有权力更新外键纪录. 维护端注解 @OneToMany(cascade = { CascadeType.PERSIST, Ca ...

  8. FTP远程命令集

    使用ftp命令进行远程文件传输 ftp命令是标准的文件传输协议的用户接口.ftp是在TCP/IP网络上的计算机之间传输文件的简单有效的方法.它允许用户传输ASCII文件和二进制文件. 在ftp会话过程 ...

  9. 为DELL inspiron 14R安装CentOS X64 6.4

    今天接到一个任务,为DELL inspiron 14R安装CentOS X64 6.4,本以为这是小菜一碟,不算个啥,大大小小安装LINUX CENTOS 不下上百次了,还怕这个?结果,各种碰壁... ...

  10. sqldependency 支持的select

    https://msdn.microsoft.com/library/ms181122.aspx   支持的 SELECT 语句 满足下列要求的 SELECT 语句支持查询通知: 必须显式说明 SEL ...