import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; public class Main { public static void main(String[] args) {
//方法一:继承Thread
int i = 0;
// for(; i < 100; i++){
// System.out.println(Thread.currentThread().getName() + " " + i);
// if (i == 5) {
// ThreadExtendsThread threadExtendsThread = new ThreadExtendsThread();
// threadExtendsThread.start();
// }
// } //方法二:实现Runnable
// for(i = 0; i < 100; i++){
// System.out.println(Thread.currentThread().getName() + " " + i);
// if (i == 5) {
// Runnable runnable = new ThreadImplementsRunnable();
// new Thread(runnable).start();
// new Thread(runnable).start();
// }
// } //方法三:实现Callable接口
Callable<Integer> callable = new ThreadImplementsCallable();
FutureTask<Integer> futureTask = new FutureTask<>(callable);
for(i = 0; i < 100; i++){
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 5) {
new Thread(futureTask).start();
new Thread(futureTask).start();
}
}
try {
System.out.println("futureTask ruturn: " + futureTask.get());
} catch (Exception e) {
e.printStackTrace();
}
} }

方法一,继承自Thread

public class ThreadExtendsThread extends Thread {
private int i;
@Override
public void run() {
for(; i < 100; i++) {
System.out.println(getName() + " " + i);
}
}
}

run方法为线程执行体,ThreadExtendsThread对象即为线程对象。

方法二,实现Runnable接口

public class ThreadImplementsRunnable implements Runnable {
private int i;
@Override
public void run() {
for(; i < 100; i++){
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}

run方法为线程执行体,使用时New一个Thread对象,Runnable对象作为target传递给Thread对象。且同一个Runnable对象可作为多个Thread的target,这些线程均共享Runnable对象的实例变量。

方法三,实现Callable接口

import java.util.concurrent.Callable;

public class ThreadImplementsCallable implements Callable<Integer> {
private int i; @Override
public Integer call() throws Exception {
for(; i < 100; i++){
System.out.println(Thread.currentThread().getName() + " " + i);
}
return i;
}
}

Callable接口类似于Runnable接口,但比对方强大,线程执行体为call方法,该方法具有返回值和可抛出异常。使用时将Callable对象包装为FutureTask对象,通过泛型指定返回值类型。可稍候调用FutureTask的get方法取回执行结果。

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

  1. Java实现多线程的三种方式

    Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.前两种方式启动的线程没有返回值 ...

  2. [JAVA]JAVA实现多线程的三种方式

    1.继承Thread类,通过start()方法调用 public class MultiThreadByExtends extends Thread { @Override public void r ...

  3. java创建多线程的三种方式

    /***************************继承Thread类创建多线程************************/ public class FirstThread extends ...

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

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

  5. java 获取时间戳的三种方式

      java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMi ...

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

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

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

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

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

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

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

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

随机推荐

  1. ruby -- 基础学习(五)empty、nil、blank三者之间的区别

    这三个方法在ROR中经常用到,都是用来判断是否为空的. 区别是: ruby的方法:.nil?..empty? rails的方法 :.blank? 用法的区别: .nil?    :   判断对象是否存 ...

  2. [Math] A love of late toward Mathematics - how to learn it?

    Link: https://www.zhihu.com/question/19556658/answer/26950430     王小龙 ,数学,计算机视觉,图形图像处理 数学系博士怒答! 我想大家 ...

  3. Frame - 快速创建高品质的 Web 应用原型

    Frame 是一个让你够能够快速创建高品质的网站或应用程序产品原型的工具.你上传的图片将被包裹在真实的设备环境中.它是一个用于创建宣传资料的专业工具.Frame 完全免费供给商业和个人使用.他们也正探 ...

  4. Linux网络管理

    关于OSI七层模型.TCP五层模型.TCP的三次握手.HTTP协议.DNS解析等相关的网络基础知识请参考我整理的一篇博客:http://www.cnblogs.com/wxisme/p/4699049 ...

  5. SQL Server技术问题之游标优缺点

    分类: MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标. (1) Transact_SQL 游标 Transact_SQL 游标是由DEC ...

  6. percona-toolkit介绍及安装

    percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,包括: 1. 检查master和slave数据的一致性 2. 有效地 ...

  7. 高级四则运算器—结对项目反思(193 & 105)

    高级四则运算器—结对项目反思(193 & 105) 本周我和一位韩国同学(71061105)一起结对编程完成了我们的结对项目——高级的小学四则运算题目生成器. PSP表格   PSP2.1 P ...

  8. ASP.NET MVC5利用EF,反向自动生成数据库

    1.在Model类里面,写好相应的属性. using System; using System.Collections.Generic; using System.Linq; using System ...

  9. Water --- CSU 1550: Simple String

    Simple String Problem's Link:   http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1550 Mean: 略. analy ...

  10. C++ - 多线程的实现

    支持多线程可谓是C++语言最大的变化之一. 此前,C++只能利用操作系统的功能(Unix族系统使用pthreads库),或是例如OpenMP和MPI这些代码库,来实现多核计算的目标. C++本身并没有 ...