首页 > 编程语言 >Java并发编程

Java并发编程

时间:2024-07-23 16:55:54浏览次数:12  
标签:Java java 编程 System util 并发 线程 import public

 

目录

 

1、JUC并发编程

2、线程池

3、Executor接口

 4、ExecutorServicw接口

(1)语句:创建线程池

(2)语句:调用线程:

执行结果:​编辑 5、对比调用线程池和直接创建线程程序执行速度

 6、插入知识点:输出系统时间/程序执行的时间


1、JUC并发编程

它是Java.util.concurrent包的简写

2、线程池

其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建和销毁线程对象的错误,节省了资源的开销

3、Executor接口

这是Java并发编程的基础接口,此接口只有一个方法execute(),表示接收一个实现了Runnale接口的对象做为执行参数来执行,该对象我们可以理解为需要执行的任务,至于这个任务交给哪个线程执行,由具体的Executor决定

 4、ExecutorServicw接口

它表示线程池,它是Executor接口的子接口
它有一个shutdown();该线程池不再接受新的任务,等待队列中 任务会继续执行完成

executor.shutdown();


Executors帮助类,这是Executor接口的帮助类,它提供了一系列静态的工厂方法帮我们创建不同的ExecutorService线程池对象

executor.shutdown();

 newFixedThreadPool(线程数)——创建指定大小 的线程

(1)语句:创建线程池

 ExecutorService executor=
                Executors.newFixedThreadPool(10);

(2)语句:调用线程:

 executor.execute(new MyThread());


newSingleThreadExecutors()

创建一个只有一个线程的线程池

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test15 {
    public static void main(String[] args) {
        ExecutorService executor=
                Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            executor.execute(new MyThread());
        }
        executor.shutdown();
    }
}

public class MyThread implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()
                + "线程正在执行……");
    }
}

执行结果: 5、对比调用线程池和直接创建线程程序执行速度

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test17 {
    public static void main(String[] args) {
      myPool();
    }
    //50万线程不用线程池
   
    //50万线程用线程池
    private static void myPool(){
        long start= System.currentTimeMillis();
        Random random=new Random();
        List<Integer> list =new ArrayList<>();
        ExecutorService executorService =
                Executors.newFixedThreadPool(10);
        for (int i = 0; i < 500000; i++) {
           executorService.execute(()->{
               list.add(random.nextInt());
           });
        }
        System.out.println("50万线程线程池,需要时间" + (System.currentTimeMillis() -start));
    }

}

 

执行结果:

 

 

原因:创建内含10个线程线程池,然后调用50w次

不用线程池:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test17 {
    public static void main(String[] args) {
      myThread();
    }
    //50万线程不用线程池
    private static void myThread(){
        long start= System.currentTimeMillis();
        Random random=new Random();
        List<Integer> list =new ArrayList<>();
        for (int i = 0; i < 500000; i++) {
            Thread thread =new Thread(()->{
                list.add(random.nextInt());
            });
            thread.start();
        }
        System.out.println("50万线程不用线程池,需要时间" + System.currentTimeMillis());
    }
   
}

执行结果: 

原因:创建50个线程,所以时间长

Thread thread =new Thread(()->{
                list.add(random.nextInt());
            });

 6、插入知识点:输出系统时间/程序执行的时间

​
public class Test16 {
    public static void main(String[] args) {
  long start =System.currentTimeMillis();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(System.currentTimeMillis() - start);
    }
}

​

输出系统时间:

 System.out.println(System.currentTimeMillis());

程序执行的时间

 long start =System.currentTimeMillis();
 System.out.println(System.currentTimeMillis() - start);

标签:Java,java,编程,System,util,并发,线程,import,public
From: https://blog.csdn.net/xjdkxnhcoskxbco/article/details/140638349

相关文章

  • Java入门基础-10面向对象高级
    Java入门基础-10面向对象高级本章知识点总结于黑马程序员的视频课程:《Java入门基础课程》,是对上课做的笔记Java入门基础课程视频地址上一章:Java入门基础-09综合案例ATM系统目录Java入门基础-10面向对象高级前言staticstatic修饰成员变量static修饰成员变量的应用场......
  • Java入门基础-09综合案例ATM系统
    Java入门基础-09综合案例ATM系统本章知识点总结于黑马程序员的视频课程:《Java入门基础课程》,是对上课做的笔记Java入门基础课程视频地址上一章:Java入门基础-08常用API目录Java入门基础-09综合案例ATM系统前言01系统构架搭建、欢迎页设计Account.javaATM.javaTest.......
  • 三种语言实现计算逆序对的数量(C++/Python/Java)
    题目给定一个长度为......
  • 第二章-Java内存区域与内存溢出异常-随笔
    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。1.程序计数器程序计数器可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序......
  • 第一百七十六节 Java IO教程 - Java内存通道、Java文件锁
    JavaIO教程-Java内存通道对文件执行I/O的另一种方法是将文件的一个区域映射到物理内存,并将其作为内存数组。我们可以使用MappedByteBuffer来执行内存映射文件I/O。要使用内存映射文件I/O,请为文件获取FileChannel对象,并使用FileChannel的map()方法获取MappedByteBuffer。......
  • 第一百七十六节 Java IO教程 - Java文件系统、Java路径
    JavaIO教程-Java文件系统Java7引入了新的输入/输出2(NIO.2)API并提供了一个新的 I/OAPI。它向Java类库添加了三个包:java.nio.file,java.nio.file.attribute和java.nio.file.spi。文件系统FileSystem类的对象表示Java程序中的文件系统。FileSystem对象用于执行两个任务......
  • Java实现七大排序(二)
    一.交换排序1.冒泡排序这个太经典了,每个学编程都绕不开的。原理跟选择排序差不多,不过冒泡排序是直接交换。publicstaticvoidbubbleSort(int[]array){for(inti=0;i<array.length-1;i++){for(intj=0;j<array.length-1-i;j++)......
  • 三种语言实现归并排序(C++/Python/Java)
    题目给定你一个长度为......
  • 系统整容纪:揭秘Java编程之美:掌握这些编码规范,让你的代码一跃成为行业典范
     分享工作中的点点滴滴,贯彻千里之行,始于足下,最终以微不足道的量变引起化蝶的质变精神。以自己为例拒绝在舒适的中央区域安逸的躺着,以便在不知不觉中被社会所淘汰,也不盲目的直接跃迁进困哪区域,在受挫的同时又跌回原有的舒适区域内,造成这样一个浑浑噩噩的让人无法进步的循环怪圈......
  • MVCC和多版本并发控制策略
    MVCC:多版本并发控制引言在现代数据库管理系统中,并发控制是确保数据一致性和完整性的关键机制之一。随着应用程序对数据库性能要求的不断提高,传统的锁机制(如悲观锁)在某些场景下可能会成为性能瓶颈。为了克服这些限制,多版本并发控制(MVCC)应运而生,它允许数据库事务在读取数据......