首页 > 编程语言 >java多线程

java多线程

时间:2023-07-22 09:44:41浏览次数:45  
标签:ExecutorService java Thread run 线程 new 多线程 public

java中多线程的实现其实和c++类似,介绍几种常用方法

1.继承Thread类,重写其run方法

class MyThread extends Thread{
    public MyThread() {
    }
 
    public MyThread(String name) {
        super(name);
    }
    @Override
    public void run(){
        System.out.println(getName());
    }
}

public class threadTest {
    public static void main(String[] Args){
        Thread test1 = new MyThread("test1");
        Thread test2 = new MyThread("test2");
        Thread test3 = new MyThread("test3");
        test1.run();
        test2.run();
        test3.run();
    }
}

2.实现Runnable接口,实现其run方法

class MyRunnable implements Runnable{
    @Override
    public void run(){
        System.out.println("running");
    }
}

public class threadTest {
    public static void main(String[] Args){
        Thread test1 = new Thread(new MyRunnable());
        Thread test2 = new Thread(new MyRunnable());
        Thread test3 = new Thread(new MyRunnable());
        test1.run();
        test2.run();
        test3.run();
    }
}

3.实现Callable接口(类似于c++中的async任务实现,可获得返回值),重写call方法

FutureTask继承了Future接口并且支持Callable接口注入,从而实现任务式异步。

public class threadTest {
    public static void main(String[] Args){
        //此处用匿名内部类实现Callable接口
        FutureTask<Object> task = new FutureTask(new Callable<String>() {
            @Override
            public String call() throws Exception{
                return new String("mycall");
            }
        });
        Thread th = new Thread(task);
        th.start();
        try{
            //调用get使主线程阻塞至任务结束,获得异步结果
            Object res = task.get();
            System.out.println(res);
        }catch(Exception e){
            e.printStackTrace();
        }

    }
}

线程池

Java中提供了ExecutorService线程池,创建其方法为ThreadPoolExecutor,具体结构如下:

public ThreadPoolExecutor(int corePoolSize,    //核心线程数,创建后不会释放
                              int maximumPoolSize,    //最大线程数(该值需大于等于核心线程数)
                              long keepAliveTime,    //空闲线程最大存活时间
                              TimeUnit unit,    //时间单位TimeUnit
                              BlockingQueue<Runnable> workQueue,    //任务队列
                              ThreadFactory threadFactory,    //线程工厂,用于创建线程
                              RejectedExecutionHandler handler)    //处理阻塞

ExecutorService有如下几个常用方法:

  • execute(Runnable)
  • submit(Runnable)
  • submit(Callable)
  • invokeAny(...)
  • invokeAll(...)

execute接收一个Runnable对象并将其放进任务队列异步执行

submit接收一个Runnable或Callable对象并返回一个Future期约,从而可以检测任务是否完成并获得任务返回值。由上可知,此处也可将FutrueTask对象给予submit

invokeAny和invokeAll接收一个Callable集合,但前者返回集合中随机一个任务的Future,后者返回Future对列,按顺序对应任务集合

 

ExecutorService有两种关闭方式

第一种是shutdown()方法,调用后ExecutorService不再接收任务并等待当前线程池中所有任务结束后关闭。

第二种是shutdownNow()方法,调用后ExecutorService立即关闭。

 

Executors中提供了几种常用线程池:

1.可缓存线程池

创建的线程均为非核心线程,空闲线程存活时间为一分钟。适合生命周期短的任务

//Executors.newCachedThreadPool();
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

2.单线程池

只有一个核心线程,使得任务队列满足FIFO

//Executors.newSingleThreadExecutor();
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

3.固定线程数线程池

固定数量核心线程

//Executors.newFixedThreadPool(n);
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

4.固定线程数,定时周期线程池

可用于替代handler.postDelay和Timer定时器等延时和周期性任务。

//Executors.newScheduledThreadPool(n);
public ScheduledThreadPoolExecutor(int corePoolSize) {
    super(corePoolSize, Integer.MAX_VALUE,
          DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
          new DelayedWorkQueue());
}

 

同样也可手动创建线程池

private ExecutorService pool = new ThreadPoolExecutor(3, 10,
            10L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(512), Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy());

 

 

 

参考文章:https://blog.csdn.net/fwt336/article/details/81530581

标签:ExecutorService,java,Thread,run,线程,new,多线程,public
From: https://www.cnblogs.com/Explosion556/p/17572188.html

相关文章

  • Solon v2.4.0 发布,Java 生态的新星燃起
    Solon是什么开源项目?一个,Java新的生态型应用开发框架。它从零开始构建,有自己的标准规范与开放生态(历时五年,已有全球第二级别的生态规模)。与其他框架相比,它解决了两个重要的痛点:启动慢,费内存。关键记事:2021年1月,正式对外开源2022年7月,建立官网,发力推广2023年2月,v2.0发布。......
  • Java Web 程序设计预习提纲
    以下是JavaWeb程序设计的预习提纲的Markdown格式示例:JavaWeb程序设计预习提纲1.Java基础回顾Java语言基础与面向对象Java类与对象的定义与使用常用数据类型与控制流程异常处理与文件I/O操作2.Servlet基础Servlet概述与生命周期Servlet的请求与响应S......
  • Python和Java的BASE64操作
    Python中的操作1.1相关链接Python编码解码---字符集/base641.2举例说明在Python中,base64.b64encode()方法用于对给定的字节数据进行Base64编码。该方法接受一个bytes-like对象(例如字节数组或字节字符串)作为输入,并返回一个Base64编码的字节字符串。使用base64.b64encode()......
  • Java文件批量上传
    Java文件批量上传在日常的开发过程中,我们常常需要将一批文件批量上传到服务器或其他存储设备上。使用Java语言可以轻松地实现这一功能。本文将介绍如何使用Java实现文件批量上传,并提供相应的代码示例。准备工作在开始编写上传文件的Java代码之前,我们需要进行一些准备工作。首先,......
  • Java随机生成因为字母
    Java随机生成因为字母在Java编程中,有时候我们需要生成随机的字母作为数据的一部分。这可能用于密码生成、验证码生成、随机字符串生成等各种应用场景。本文将介绍如何使用Java生成随机字母,并提供代码示例。1.使用Java的Random类生成随机字母Java提供了Random类,它可以生成伪随机......
  • Java数字转换为字符
    Java数字转换为字符在Java编程中,我们经常需要将数字转换为字符。这种转换可以在很多场景中使用,比如将数字转换为字符以便于打印、将数字转换为字符以便于进行字符操作等等。本文将介绍在Java中如何进行数字到字符的转换,并提供一些代码示例来帮助读者更好地理解。使用Character类......
  • Java输入汉字
    Java输入汉字实现方法作为一名经验丰富的开发者,我可以教你如何在Java中实现输入汉字的功能。下面是一个简单的流程图,展示了整个过程:步骤描述1获取用户输入的汉字2将汉字转换为Unicode编码3使用Java的IO流将Unicode编码写入文件或数据库4从文件或数据库中读......
  • Linux 网络基础 2 三次握手 三次挥手 多进程 多线程服务器
    1.包裹函数对服务器客户端等函数进行报错处理以及简化处理比如bindinttcp4bind(shortport,constchar*IP){structsockaddr_inserv_addr;intlfd=Socket(AF_INET,SOCK_STREAM,0);bzero(&serv_addr,sizeof(serv_addr));if(IP==NULL){//......
  • JavaScript学习笔记
    之所以学习JS是想更清楚的了解这门语言,记得上学那会就感觉j真难学,工作了几年了一直从事后端,但偶尔也会用前端开发,这时候就会手忙脚乱, 好多东西都是默默糊糊,还有就是,我想知道这门语言真的很难学吗?抱着好奇的心态开始了一个月的学习历程,下面整理一下一个月的学习笔记.跟着......
  • 十大排序算法 Java版
    packagealgorithm;importjava.util.Collections;importjava.util.Vector;publicclassSort{//冒泡排序publicvoidBubbleSort(int[]a){booleanflag=true;for(inti=0;i<a.length;i++){flag=false;//用于判断上......