Java多线程三种主要实现方式解析

多线程三种主要实现方式:继承Thread类,实现Runnable接口、Callable和Futrue。

一、简单实现

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

public class T02_HowToCreateThread {
  //1.继承Thread类
  static class MyThread extends Thread{
    @Override
    public void run() {
      System.out.println("MyThread-->");
    }
  }
  //3.实现Runnable接口
  static class MyRun implements Runnable{

    @Override
    public void run() {
      System.out.println("MyRunable-->");
    }
  }
  //4.实现Callable接口
  static class MyCall implements Callable{

    @Override
    public Object call() throws Exception {
      System.out.println("myCallable-->");
      return 1;
    }
  }
  public static void main(String[] args) throws ExecutionException, InterruptedException {
    //1.继承Thread类
    new MyThread().start();
    //2.lambda与继承Thread类类//1.继承Thread类似,最简单
    new Thread(()->{
      System.out.println("lambda-->");
    }).start();
    //3.实现Runnable接口
    new Thread(new MyRun()).start();
    new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("simple->Runnable");
      }
    }).start();
    //4.实现Callable接口,并用包装器FutureTask来同时实现Runable、Callable两个接口,可带返回结果
    MyCall mycall = new MyCall();
    FutureTask futureTask = new FutureTask(mycall);
    new Thread(futureTask).start();
    System.out.println(futureTask.get());
  }
}

二、使用ExecutorService、Callable和Future一起实现带返回值

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * 使用ExecutorsService、Callable、Future来实现多个带返回值的线程
 */
public class T02_HowToCreateThread02 {
  static class MyCallable implements Callable{
    private int taskNum;

    public MyCallable(int taskNum){
      this.taskNum = taskNum;
    }
    @Override
    public Object call() throws Exception {
      System.out.println("任务"+taskNum);
      return "MyCallable.call()-->task"+taskNum;
    }
  }
  public static void main(String[] args) throws ExecutionException, InterruptedException {
    int num = 5;
    //创建一个线程池
    ExecutorService pool = Executors.newFixedThreadPool(num);
    List<Future> futureList = new ArrayList<Future>();
    for (int i = 0; i < num; i++){
      MyCallable mc = new MyCallable(i);
      //执行任务,并返回值
      Future future = pool.submit(mc);
      futureList.add(future);
    }
    pool.shutdown();
    for (Future f: futureList){
      System.out.println(f.get());
    }
  }
}

结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java多线程及线程安全实现方法解析

    一.java多线程实现的两种方式 1.继承Thread /** * * @version: 1.1.0 * @Description: 多线程 * @author: wsq * @date: 2020年6月8日下午2:25:33 */ public class MyThread extends Thread{ @Override public void run() { System.out.println("This is the first thread!"); } public s

  • Java Lambda表达式原理及多线程实现

    1.使用Lambda表达式实现多线程 public static void main(String[] args) { //使用匿名内部类的方式,实现多线程 new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "新线程创建了!"); } }).start(); //使用Lambda表达式,实现多线程 new Thre

  • Java多线程实现四种方式原理详解

    1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target 3.通过Callable和FutureTask创建线程 4.通过线程池创建线程 前面两种可以归结为一类:无返回值,原因很简单,通过重写run方法,run方式的返回值是void,所以没有办法返回结果 后面两种可以归结成一类:有返回值,通过Callable接口,就要实现call方法,这个方法的返回值是Object,所以返回的结果可以放

  • Java多线程下载文件实现案例详解

    原理解析: 利用RandomAccessFile在本地创建一个随机访问文件,文件大小和服务器要下载的文件大小相同. 根据线程的数量(假设有三个线程),服务器的文件三等分,并把我们在本地创建的文件同样三等分,每个线程下载自己负责的部分,到相应的位置即可. 示例图: 代码如下 import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.U

  • Java多线程Runable售票系统实现过程解析

    一.无等待,直接出票[虽然解决了不会冲票问题,但显然不符合实际生活]: package com.thread.sale; public class Sale { public static void main(String[] args) {//悟,那么设计爬虫的时候,下载的资源唯一,使用多线程下载 SaleTickets t = new SaleTickets();//关键在这里,只创建一个对象,而后交给线程去执行这个任务,达到目的 Thread thread1 = new Thread(t)

  • 基于Java实现多线程下载并允许断点续传

    完整代码:https://github.com/iyuanyb/Downloader 多线程下载及断点续传的实现是使用 HTTP/1.1 引入的 Range 请求参数,可以访问Web资源的指定区间的内容.虽然实现了多线程及断点续传,但还有很多不完善的地方. 包含四个类: Downloader: 主类,负责分配任务给各个子线程,及检测进度DownloadFile: 表示要下载的哪个文件,为了能写输入到文件的指定位置,使用 RandomAccessFile 类操作文件,多个线程写同一个文件需要保证线

  • Java模拟多线程实现抢票代码实例

    这篇文章主要介绍了Java模拟多线程实现抢票,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 实现100张票抢购的demo 这里需要一个变量,来保存100张 局部变量: 定义在方法内,方法运行存在,方法运行结束销毁,无法保存一个持久化数据!!! 成员变量: 保存在类对象内,创建对象之后存在,对象不销毁成员变量也不会被内存收回.因为 在每一个类对象中,都存在一个对应的成员变量,这些成员变量不是同一个数据.不是 共享资源,不合适!!! 静态成员变量:

  • Java多线程三种主要实现方式解析

    多线程三种主要实现方式:继承Thread类,实现Runnable接口.Callable和Futrue. 一.简单实现 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; public class T02_HowToCreat

  • Java HashMap三种循环遍历方式及其性能对比实例分析

    本文实例讲述了Java HashMap三种循环遍历方式及其性能对比.分享给大家供大家参考,具体如下: HashMap的三种遍历方式 (1)for each map.entrySet() Map<String, String> map = new HashMap<String, String>(); for (Entry<String, String> entry : map.entrySet()) { entry.getKey(); entry.getValue();

  • 详解java倒计时三种简单实现方式

    写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package timer; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; /** * java演示倒计时 * */ public class TimeTes

  • Java监听器三种实现方法代码解析

    这是没有缩减的写法 //创建一个自定义监听器 private btnlistener btnl = new btnlistener(); //必须在一个btn创建后才添加监听器,即在类里面无法添加但构造函数可以 btn.addActionListener(btnl); //自定义监听器的内容 private class btnlistener implements ActionListener { @Override //实现接口(interface) public void actionPer

  • Java三种移位运算符原理解析

    这篇文章主要介绍了Java三种移位运算符原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规则只记住一点:丢弃最高位(符

  • java多线程编程同步器Future和FutureTask解析及代码示例

    publicinterfaceFuture<V>Future表示异步计算的结果.它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果.计算完成后只能使用get方法来获取结果,如有必要,计算完成前可以阻塞此方法.取消则由cancel方法来执行.还提供了其他方法,以确定任务是正常完成还是被取消了.一旦计算完成,就不能再取消计算.如果为了可取消性而使用Future但又不提供可用的结果,则可以声明Future<?>形式类型.并返回null作为底层任务的结果. Future主要

  • Java多线程并发编程和锁原理解析

    这篇文章主要介绍了Java多线程并发编程和锁原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等方案后,问题得到解决. 加锁方案见下文. 二.乐观锁 & 悲观锁 1.乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁

  • 彻底搞懂Java多线程(三)

    目录 Java线程池 线程池的优点 线程池的6种创建方式 创建单个线程池的作用是什么? 线程池的第七种创建方式 ThreadPoolExecutor的执行方式 ThreadPoolExecutor的执行流程 线程池的终止 线程池的状态 异步.同步 1.Java 线程 同步与异步 线程工厂 总结 Java线程池 线程的缺点: 1.线程的创建它会开辟本地方法栈.JVM栈.程序计数器私有的内存,同时消耗的时候需要销毁以上三个区域,因此频繁的创建和销毁线程比较消耗系统的资源. 2.在任务量远远大于线程可

  • Spark三种属性配置方式详解

    随着Spark项目的逐渐成熟, 越来越多的可配置参数被添加到Spark中来.在Spark中提供了三个地方用于配置: 1.Spark properties:这个可以控制应用程序的绝大部分属性.并且可以通过 SparkConf对象或者Java 系统属性进行设置: 2.环境变量(Environment variables):这个可以分别对每台机器进行相应的设置,比如IP.这个可以在每台机器的$SPARK_HOME/ conf/spark-env.sh脚本中进行设置: 3.日志:所有的日志相关的属性可以

  • Spring 3.x中三种Bean配置方式比较详解

    以前Java框架基本都采用了XML作为配置文件,但是现在Java框架又不约而同地支持基于Annotation的"零配置"来代替XML配置文件,Struts2.Hibernate.Spring都开始使用Annotation来代替XML配置文件了:而在Spring3.x提供了三种选择,分别是:基于XML的配置.基于注解的配置和基于Java类的配置. 下面分别介绍下这三种配置方式:首先定义一个用于举例的JavaBean. package com.chinalife.dao public cl

随机推荐