首页 > 其他分享 >线程的几种实现方法

线程的几种实现方法

时间:2022-09-21 18:15:35浏览次数:69  
标签:Runnable String Thread 几种 Callable 线程 方法 public

有三种使用线程的方法:

  • 实现 Runnable 接口;
  • 实现 Callable 接口;
  • 继承 Thread 类。

实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以说任务是通过线程驱动从而执行的。

Callable接口

class c implements Callable<String>{
	@Override
	public String call() throws Exception {
		return null;
	}
}	

Runnable接口

class r implements Runnable{
	@Override
	public void run() {
	}
}

Callable和Runnable的区别

相同点:

  1. 两者都是接口
  2. 两者都需要调用Thread.start启动线程

不同点:

  1. 核心方法、返回值不同(callable的核心是call方法,允许返回值,runnable的核心是run方法,没有返回值)
  2. call方法可以抛出异常,但是run方法不行

在使用过程中,Runnable可以直接放在Thread中启动,但是Callable需要借助FutureTask 来实现启动。

eg:

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

/**
 * @author: dongyq
 * @date: 2022/9/21 17:55
 * @since:
 * @功能描述:
 */
public class CallableTest implements Callable<String> {
    
    private String string;
    
    public CallableTest(String string) {
        this.string = string;
    }

    @Override
    public String call() throws Exception {
        //任务阻塞5秒,异常向上抛出
        Thread.sleep(5000);
        return this.string;
    }

    public static void main(String[] args) throws Exception {
        Callable<String> callable = new CallableTest("my callable is ok!");
        FutureTask<String> task = new FutureTask<String>(callable);
        long beginTime = System.currentTimeMillis();
        //创建线程
        new Thread(task).start();
        //调用get()方法阻塞主线程
        String str = task.get();
        long endTime = System.currentTimeMillis();
        System.out.println("hello :"+ str);
        System.out.println("time :"+ (endTime - beginTime)/1000);
    }
}

/**
 * @author: dongyq
 * @date: 2022/9/21 17:55
 * @since:
 * @功能描述:
 */
public class RunnableTest implements Runnable{
    private String str;

    public RunnableTest(String str) {
        this.str = str;
    }
    @Override
    public void run() {
        try {
            //线程休眠5s,有异常产生,只能内部解决,无法向上抛
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //5s之后输出
        System.out.println("hello:" + this.str);
    }
    
    public static void main(String[] args) {
        Runnable runnable = new RunnableTest("my runnable is ok");
        Long beginTime = System.currentTimeMillis();
        Thread thread=new Thread(()->{
            runnable.run();
        });
        thread.start();
        Long endTime = System.currentTimeMillis();
        //先输出
        System.out.println("time:" + (endTime-beginTime)/1000);
    }
}

标签:Runnable,String,Thread,几种,Callable,线程,方法,public
From: https://www.cnblogs.com/dyaqi/p/16716597.html

相关文章

  • 多行文本溢出显示省略号的方法
    两种方法:一、利用WebKit的CSS扩展属性,该方法适用于WebKit浏览器及移动端。display:-webkit-box;-webkit-box-orient:vertical;//方向-webkit-line-clamp:3;......
  • uniapp H5与原生安卓的数据互通和方法调用
    1、准备我这里是uniapp与原生安卓之间的相互调用,也就是原生安卓内嵌H5页面,下面先来准备一下安卓端的代码。(1)、初始化的MainActivity类定义一个WebViewprivateWebView......
  • github-file-upload 配置方法
    token(这是个无效的,你需要自己获取):ghp_6qfPsQlj2WxHmhOAluO7ZsT7NAc5NX16xzyQ 如何获取?用户名/仓库名:10086/typora  如何获取?>>存放分支: master   ......
  • 5种kafka消费端性能优化方法
    摘要:带你了解基于FusionInsightHD&MRS的5种kafka消费端性能优化方法。本文分享自华为云社区《FusionInsightHD&MRSkafka消费端性能优化方法》,作者:穿夹克的坏猴子。kaf......
  • 记录nodejs中querystring‘已弃用’三种处理方法
    一.升级node版本,修改引入方式//升级到18.x版本后修改引入方式constquerystring=require('node:querystring')二.官方推荐URLSearchParams替代因为不想升级就按照......
  • 【Redis】Redis是单线程还是多线程
     Redis6.0版本之前的单线程指的是其网络I/O和键值对读写是由一个线程完成的Redis6.0引入的多线程指的是网络请求过程采用了多线程,而键值对读写命令仍然是单线程处......
  • 同步方法里调用异步方法会卡死
    C#同步方法中调用异步方法 一、结果:关于ThreadPool中的线程调用算法,其实很简单,每个线程都有一个自己的工作队列localqueue,此外线程池中还有一个globalqueue全局工......
  • problem.conf 配置方法
    基本设置problem.conf中一行只能含有一个设置(不然可能会出现奇怪的错误?)use_builtin_judger大多数题的problem.conf里都要有use_builtin_judgeron这句话,这表示您需......
  • Cannot read properties of null (reading 'pickAlgorithm')的解决方法
    在使用npmi安装项目的依赖包时,出现如下报错:解决办法执行npmcacheclear--force指令后,再执行npmi即可正常安装依赖包......
  • 【中科三方】IPv4向IPv6转换的几种技术分析,ipv6转换注意事项
    一、IPv6介绍随着互联网技术的不断发展,IPv4的许多缺陷逐渐暴露出来,其中最突出的是IP地址空间将被耗尽和主干路由表不断增长的问题。为了扩大地址空间,拟通过IPv6重新定义地......