2019独角兽企业重金招聘Python工程师标准>>>

1、多线程的使用方式

1.1、继承Thread类

继承Thread并重写run()方法,Thread类中的start方法会去调用系统的方法执行相应的线程。实际上Thread也是实现了Runable接口的,从该类的文档中我们能找到。

1.2、实现Runable接口

实现Runable接口,并重写run()方法,启动线程必须要使用Thread类的start()方法。

1.3、实现Callable接口

实现Callable接口的代码例子:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;   /** *//**  * Callable 和 Future接口  * Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。  * Callable和Runnable有几点不同:  * (1)Callable规定的方法是call(),而Runnable规定的方法是run().  * (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。  * (3)call()方法可抛出异常,而run()方法是不能抛出异常的。  * (4)运行Callable任务可拿到一个Future对象,  * Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。  * 通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。  */
public class CallableAndFuture {   /** *//**  * 自定义一个任务类,实现Callable接口  */  public static class MyCallableClass implements Callable{   // 标志位   private int flag = 0;   public MyCallableClass(int flag){   this.flag = flag;   }   public String call() throws Exception{   if (this.flag == 0){   // 如果flag的值为0,则立即返回   return "flag = 0";   }    if (this.flag == 1){   // 如果flag的值为1,做一个无限循环   try {   while (true) {   System.out.println("looping.");   Thread.sleep(2000);   }   } catch (InterruptedException e) {   System.out.println("Interrupted");   }   return "false";   } else {   // falg不为0或者1,则抛出异常   throw new Exception("Bad flag value!");   }   }   }   public static void main(String[] args) {   // 定义3个Callable类型的任务   MyCallableClass task1 = new MyCallableClass(0);   MyCallableClass task2 = new MyCallableClass(1);   MyCallableClass task3 = new MyCallableClass(2);   // 创建一个执行任务的服务   ExecutorService es = Executors.newFixedThreadPool(1);   try {   // 提交并执行任务,任务启动时返回了一个 Future对象,   // 如果想得到任务执行的结果或者是异常可对这个Future对象进行操作   Future future1 = es.submit(task1);   // 获得第一个任务的结果,如果调用get方法,当前线程会等待任务执行完毕后才往下执行   System.out.println("task1: " + future1.get());   Future future2 = es.submit(task2);   // 等待5秒后,再停止第二个任务。因为第二个任务进行的是无限循环   Thread.sleep(5000);   System.out.println("task2 cancel: " + future2.cancel(true));   // 获取第三个任务的输出,因为执行第三个任务会引起异常   // 所以下面的语句将引起异常的抛出   Future future3 = es.submit(task3);   System.out.println("task3: " + future3.get());   } catch (Exception e){   System.out.println(e.toString());   }   // 停止任务执行服务   es.shutdownNow();   }
}

2、线程同步

2.1、同步代码块

synchronized("锁"){  //在这里锁通常有两种,一种是字符串常量,另外一种是this

//需要同步执行的代码块
}

2.2、同步方法

public synchronized void xxx(){
        //同步方法
}

3、总结

3.1、所有线程的启动都必须调用Thread类中的start()方法

new Thread("线程名字").start();

3.2、实现Runable是首先应该考虑的方法,有下面的两点原因

  • 在Java中继承类具有局限性,每个类只能继承一个类,但是能实现多个接口
  • 实现Runable接口能更好的共用数据
  • 实现Callable能返回值(其它两个方法,在线程结束之后不能返回值)

转自:

        https://blog.csdn.net/jpzhu16/article/details/53326506

        https://my.oschina.net/rouchongzi/blog/129333

本文进行了新的排版,文字信息主要来自于上述链接。

转载于:https://my.oschina.net/watsonos/blog/1807910

Java8——三种多线程方式相关推荐

  1. java多线程实现表复制_Java多线程的三种实现方式

    今天简单说一下Java三种多线程实现方式和区别,主要有实现Runnable.Callable和继承Thread三种方式. 实现Runnable的方式 这种方式比较常用,当我们的线程类有继承其他的类的情 ...

  2. Java多线程的三种实现方式(重点看Collable接口实现方式)

    1.通过继承Thread类来实现多线程 在继承Thread类之后,一定要重写类的run方法,在run方法中的就是线程执行体,在run方法中,直接使用this可以获取当前线程,直接调用getName() ...

  3. Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题

    Java多线程:多线程同步安全问题的 "三" 种处理方式 ||多线程 "死锁" 的避免 || 单例模式"懒汉式"的线程同步安全问题 每博一文 ...

  4. 分布式锁简单入门以及三种实现方式介绍(滴滴)

    很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的 ...

  5. 线程的三种创建方式以及代码实现

    线程和进程的概念 一个进程可以有多个线程 程序:是指令和数据的有序集合(静态的) 进程:是执行程序的一次执行过程(动态的),是系统资源分配的单位.在操作系统中运行的程序就是进程. 通常在一个进程中可以 ...

  6. memcached 分布式锁 java_分布式锁的三种实现方式

    分布式锁的三种实现方式 一.zookeeper 1.实现原理: 基于zookeeper瞬时有序节点实现的分布式锁,其主要逻辑如下(该图来自于IBM网站).大致思想即为:每个客户端对某个功能加锁时,在z ...

  7. iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...

  8. 线程的三种创建方式和他们的优缺点

    文章目录 一.线程的三种创建方式 1.继承Thread 2.实现Runable接口 3.实现Callable接口 二.三种创建方式的优缺点 1.使用Runnable接口比使用继承Thread的优势 2 ...

  9. Spring 的三种注入方式,到底哪种注入方式最佳?

    1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下. 1.1 属性注入 属性注入是大家最为常见也是使用最 ...

最新文章

  1. 温度单闭环实验计算机控制,过程控制系统实践指导简介,目录书摘
  2. 实战tkinter图形界面开发_如何进行简单的图形开发?
  3. (转)WCF教程系列(1)-创建第一个WCF程序
  4. 【线段树】海报(loj 3264)
  5. 重复运行JUnit测试而没有循环
  6. [Leetcode][第5458题][JAVA][字符串的好分割数目][双指针][HashSet]
  7. Leetcode 杂题
  8. idea没有代码自动提示功能和包自动引入不了问题
  9. Java基础学习总结(126)——Log4j2.xml生产环境实用配置
  10. java就业班学什么呀_传智播客JAVA就业班学习心得
  11. Xshell连接centOS7与CentOS7联网——一步到位
  12. linux 锐捷客户端 脚本,常熟理工学院锐捷客户端 for Linux
  13. 自适应迁移学习核极限学习机KELM用于分类
  14. linux怎么生成arm文件,Linux下ffmpeg转换工具配置(MP3和AMR格式文件互转).docx
  15. 苹果12可以双开微信吗 iPhone 12双开微信教程「iphone技巧」
  16. html4角星,运用ai绘画出5角星4角星三角形形状的设置步骤
  17. org.springframework.util.AntPathMatcher:URL 与 匹配规则
  18. APM时代的质量保障之路:腾讯互娱品质管理部性能负责人访谈
  19. 炼数成金 mysql_MySQL DBA从小白到大神实战 MySQL运维DBA课程 炼数成金MySQL企业运维视频教程...
  20. java计算机毕业设计自考学位系统源程序+mysql+系统+lw文档+远程调试

热门文章

  1. tensorflow 加载下载波士顿房价数据集
  2. 目标检测--Accurate Single Stage Detector Using Recurrent Rolling Convolution
  3. LeetCode 905 Sort Array By Parity--Java stream,Python lambda表达式一行 解法
  4. miui12 android版本,miui12基于安卓几版本开发的?miui12是安卓11吗
  5. java list键值_java基础之对List,Map,Set等集合键值对的简单认识
  6. 【RocketMQ工作原理】消息的清理
  7. Mac上Homebrew的使用
  8. matlab实现周期阶跃函数,连续时间信号傅利叶变换与MATLAB实现.doc
  9. java webservice接口开发_php开发webservice服务端接口(wsdl)
  10. 手把手教你使用 Python 制作贪吃蛇游戏