一、继承Thread类

  1. 定义一个类继承线程类Thread
  2. 重写run()方法
  3. 创建线程对象
  4. 调用线程对象的start()方法创建线程

Thread类的常用API

  • setName(String name):给线程取名字
  • getName():获取线程的名字
  • public static Thread currentThread():获取当前线程对象,这个代码在哪个线程中就获取哪个线程对象
  • public static void sleep(long time):让当前线程休眠多少毫秒再继续执行

优点:

  • 编码简单

缺点:

  • 线程类已经继承Thread就无法继承其他类了,功能无法通过继承拓展(单继承的局限性)

二、实现Runable接口

  1. 定义一个线程任务类实现Runable接口
  2. 重写run()方法
  3. 创建线程任务对象
  4. 把线程任务对象包装成线程对象
  5. 调用线程对象的start()方法启动线程
class MyRunable implements Runnable{

    @Override
public void run() {
System.out.println("hello runable");
}
}
public static void main(String[] args) {
MyRunable target = new MyRunable();
Thread t = new Thread(target);
t.start();
}

优点:

  • 避免了Java单继承的局限性
  • 同一个任务对象可以被包装成多个线程对象
  • 适合多个线程去共享同一个资源
  • 实现解耦,线程任务代码可以被多个线程共享,线程任务代码和线程独立
  • 线程池只能放入实现Runable和Callable接口的线程任务,不能直接放入继承Thread类的线程对象

缺点

  • 编码复杂(其实还好啦)

匿名内部类的写法:

Runnable target = new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类写法");
}
};
Thread t = new Thread(target);
t.start(); //简化
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类写法");
}
}).start(); //再简化
new Thread(() -> System.out.println("匿名内部类写法")).start();

三、实现Callable接口

  1. 定义一个线程任务类实现Callable接口,申明线程执行的结果类型
  2. 重写线程任务类的call方法,这个方法可以直接返回执行结果
  3. 创建一个Callable的线程任务对象
  4. 把线程任务对象包装成一个未来任务对象
  5. 把未来任务对象包装成线程对象
  6. 调用start()方法启动线程
//1.定义一个线程任务类实现Callable接口,申明线程执行的结果类型
class MyCallable implements Callable<String>{ //2.重写线程任务类的call方法,这个方法可以直接返回执行结果
@Override
public String call() throws Exception {
System.out.println("hello callable");
return "success";
}
}
//3.创建一个Callable的线程任务对象
Callable<String> call = new MyCallable();
//4.把线程任务对象包装成一个未来任务对象
//-- 未来任务对象其实就是一个Runable对象,这样就可以被包装成线程对象
//-- 未来任务对象可以在线程执行完毕后得到线程执行结果
FutureTask<String> future = new FutureTask<>(call); //5.把未来任务对象包装成线程对象
Thread t = new Thread(future);
t.start(); //获取线程执行结果,如果线程还没执行完,让出CPU等线程执行完再来去结果
try {
String res = future.get();
System.out.println(res);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}

优点:

  • 拥有所有Runable的优点
  • 能直接得到线程执行的结果

缺点:

  • 编码复杂

Java基础:线程的三种创建方式的更多相关文章

  1. java中线程的三种实现方式

    一下记录下线程的3中实现方式:Thread,Runnable,Callable 不需要返回值时,建议使用Runnable:有返回值时建议使用Callable 代码如下所示: package com.f ...

  2. java中线程的两种创建方式

    第一种:继承java.lang.Thread类.然后重写run方法 例如我们模拟一个龟兔赛跑 1 package edu.aeon.thread; 2 3 /** 4 * 说明:模拟龟兔赛跑 5 * ...

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

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

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

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

  5. [编程基础] C++多线程入门1-创建线程的三种不同方式

    原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 1 创建线程的三种不 ...

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

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

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

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

  8. 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)

    线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...

  9. Struts2之命名空间与Action的三种创建方式

    看到上面的标题,相信大家已经知道我们接下来要探讨的知识了,一共两点:1.package命名空间设置:2.三种Action的创建方式.下面我们开始本篇的内容: 首先我们聊一聊命名空间的知识,namesp ...

  10. JavaScript 闭包的详细分享(三种创建方式)(附小实例)

    JavaScript闭包的详细理解 一.原理:闭包函数--指有权访问私有函数里面的变量和对象还有方法等:通俗的讲就是突破私有函数的作用域,让函数外面能够使用函数里面的变量及方法. 1.第一种创建方式 ...

随机推荐

  1. TVM 中的 Profiler 设计

    一.基本用法 首先看 Profiler 的用法: with ms.Profiler() as profiler: # .... 用户代码 print("Tuning Time:") ...

  2. MindSpore反向传播配置关键字参数

    技术背景 在MindSpore深度学习框架中,我们可以向construct函数传输必备参数或者关键字参数,这跟普通的Python函数没有什么区别.但是对于MindSpore中的自定义反向传播bprop ...

  3. 阿里云sdk调用

    slb调用 环境包安装 pip install alibabacloud_credentials  --trusted-host mirrors.aliyun.com  -i  http://mirr ...

  4. VSCode:让VSCode终端面板显示到右边

    很简单,右击下方终端面板,选中"将视图移动到侧面板": 可以看到终端成功显示到右边了:

  5. linux 下对zip,rar,tar,tar.gz,tar.bz2,tar.xz,gzip,bzip2,xz文件的归档,压缩和解压缩

    目录 一.关于打包和压缩 二.linux对rar文件的压缩和解压缩 三.使用tar对文件进行归档,压缩,解压缩 3.1 tar对文件进行归档和解压 3.2 归档的添加和删除 3.3 tar对文件进行归 ...

  6. java练习项目——记账本

    包含登录.注册.记账.每日账单查看.每月报表.添加记账类型这些功能.数据存储采用的是txt文档+xml文档.程序是一个控制台程序,用IntelliJ IDEA+jdk8开发.涉及到的知识有List集合 ...

  7. Android 13 - Media框架(32)- ACodec(八)

    关注公众号免费阅读全文,进入音视频开发技术分享群! 拖了好久都没有更新,前面写的东西都有些忘了,回过头来再看之前写的内容,觉得有很多地方写的不好,或者说现在又有了新的理解,想要重新修改但是需要修改的内 ...

  8. Inno Setup Dependency Installer 安装包 运行环境安装

    Download and install any dependency such as .NET, Visual C++ or SQL Server during your application's ...

  9. .NETCore Nuget 发布包含静态文件 content file

    .NETCore 在.csproj引用资源中标记pack配置 <pack>true</pack>1例如 <ItemGroup> <Content Includ ...

  10. Linux命令行优化,历史记录优化

    #命令行优化: echo "export PS1='\[\033[01;31m\]\u\[\033[00m\]@\[\033[01;32m\]\h\[\033[00m\][\[\033[01 ...