精华内容
下载资源
问答
  • 2021-03-06 17:13:39

    创建文件是一种非常常见的IO操作,在这一小节中我们将学习如何在java中创建文件的几个方法。

    在java中创建文件有三种流行的方法,下面将一个一个地来学习。

    方法一:使用File.createNewFile()方法

    java.io.File类可用于在Java中创建新文件。当初始化File对象时,需要提供一个文件名,然后调用createNewFile()方法来在Java中创建新文件。

    如果创建新文件成功,则文件createNewFile()方法返回true,如果文件已存在则返回false。当它无法创建文件时,此方法也会抛出java.io.IOException异常。创建的文件为空且零字节。

    当通过传递文件名来创建File对象时,它可以是绝对路径,或者只能提供文件名,或者可以提供相对路径。

    对于非绝对路径,File对象尝试查找项目根目录中的文件。如果从命令行运行程序,对于非绝对路径,File对象会尝试从当前目录中查找文件。

    在创建文件路径时,应该使用System属性file.separator来使程序平台独立。

    下面让我们来看看使用java程序创建一个新文件的不同场景。

    import java.io.File;

    import java.io.IOException;

    public class CreateNewFile {

    /**

    * 该类显示了如何在Java中创建文件

    *

    * @param args

    * @throws IOException

    */

    public static void main(String[] args) throws IOException {

    String fileSeparator = System.getProperty("file.separator");

    // 带路径的绝对文件名

    String absoluteFilePath = "temp" + fileSeparator + "temp2" + fileSeparator + "file.txt";

    System.out.println(System.getProperty("user.dir"));

    File file = new File(absoluteFilePath);

    if (file.createNewFile()) {// 工程目录下要有一个目录:temp/temp2

    System.out.println(absoluteFilePath + " File Created");

    } else

    System.out.println("File " + absoluteFilePath + " already exists");

    // 只提供文件名称

    file = new File("file.txt");

    if (file.createNewFile()) {

    System.out.println("file.txt File Created in Project root directory");

    } else

    System.out.println("File file.txt already exists in the project root directory");

    // 相对路径

    String relativePath = "tmp" + fileSeparator + "file.txt";

    file = new File(relativePath);

    if (file.createNewFile()) {

    System.out.println(relativePath + " File Created in Project root directory");

    } else

    System.out.println("File " + relativePath + " already exists in the project root directory");

    }

    }

    当第一次在Eclipse IDE执行上述程序时,会生成以下输出。

    D:\worksp\eclipsej2ee\TestJava

    temp\temp2\file.txt File Created

    file.txt File Created in Project root directory

    Exception in thread "main" java.io.IOException: 系统找不到指定的路径。

    at java.io.WinNTFileSystem.createFileExclusively(Native Method)

    at java.io.File.createNewFile(Unknown Source)

    at CreateNewFile.main(CreateNewFile.java:37)

    对于相对路径,它会抛出IOException异常,因为项目根文件夹中不存在tmp目录。所以很明显createNewFile()只是尝试创建文件,任何绝对或相对的目录都应该存在,否则抛出IOException异常。所以需要在项目根目录中创建tmp目录并再次执行程序,输出如下所示 -

    D:\worksp\eclipsej2ee\TestJava

    File temp\temp2\file.txt already exists

    File file.txt already exists in the project root directory

    tmp\file.txt File Created in Project root directory

    方法二: 使用FileOutputStream.write(byte[] b)方法

    如果要创建新文件并同时并写入一些数据,可以使用FileOutputStream方法。下面是一个简单的代码片段,用于演示它的用法。上面讨论的绝对路径和相对路径的规则也适用于这种情况。

    String fileData = "Maxsu from Yiibai.com";

    FileOutputStream fos = new FileOutputStream("readme.txt");

    fos.write(fileData.getBytes());

    fos.flush();

    fos.close();

    方法三: 使用Java NIO Files.write()方法

    可以使用Java NIO Files类来创建一个新文件并将一些数据写入其中。这是一个很好的选择,因为它不必担心关闭IO资源。

    String fileData = "Maxsu from Yiibai.com";

    Files.write(Paths.get("readme.txt"), fileData.getBytes());

    上面就是在java程序中常用用于创建新文件的全部内容。

    ¥ 我要打赏

    纠错/补充

    收藏

    加QQ群啦,易百教程官方技术学习群

    注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

    更多相关内容
  • IDEA创建SpringBoot项目步骤记录

    热门讨论 2016-11-30 22:26:26
    IDEA创建SpringBoot项目步骤记录,记录了从项目开始创建到运行的过程
  • MySQL创建数据库和创建数据表

    万次阅读 多人点赞 2019-10-20 23:44:40
    MySQL 创建数据库和创建数据表 MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD。 在这之前,需要先安装好 MySQL ,然后创建好数据库、数据表、操作用户。 一、数据库操作语言 数据库...

    MySQL 创建数据库和创建数据表

    MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD。

    在这之前,需要先安装好 MySQL ,然后创建好数据库、数据表、操作用户。

    一、数据库操作语言

    数据库在操作时,需要使用专门的数据库操作规则和语法,这个语法就是 SQL(Structured Query Language) 结构化查询语言。

    SQL 的主要功能是和数据库建立连接,进行增删改查的操作。SQL是关系型数据库管理系统的标准语言。

    SQL 语言的作用:

    1. 数据定义语言 DDL(Data Definition Language) 。用于创建数据库,数据表。

    2. 数据操作语言 DML(Data Manipulation Language) 。用于从数据表中插入、修改、删除数据。

    3. 数据查询语言 DQL(Data Query Language) 。用于从数据表中查询数据。

    4. 数据控制语言 DCL(Data Control Language) 。用来设置或修改数据库用户或角色的权限。

    使用 SQL 操作数据库时,所有的 SQL 语句都以分号结束。(切换数据库时可以不用分号)

    在 SQL 语句中,不区分大小写,编写 SQL 语句时可以根据情况用大小写的区别来增加可读性。

    二、创建数据库

    1. 连接 MySQL

    输入 mysql -u root -p 命令,回车,然后输入 MySQL 的密码(不要忘记了密码),再回车,就连接上 MySQL 了。

    mysql -u root -p

    最初,都是使用 root 用户登录,工作中如果一直用 root 用户登录,因为权限太大,风险是很大的,所以等创建好权限适合的用户后,就不要经常登录 root 用户了。

    2. 查看当前的数据库

    使用 show databases; 查看当前安装的 MySQL 中有哪些数据库。

    show databases;

    刚安装 MySQL 时,默认有四个数据库,information_schema,mysql,perfomance_schema,sys 。通常情况下,我们不会直接使用这四个数据库,但千万不要把这四个数据库删了,否则会带来很多不必要的麻烦。如果不小心删了,建议是重新安装 MySQL ,在重装之前把自己的数据迁移出来备份好,或者从其他服务器上迁移一个相同的数据库过来。

    3. 创建数据库

    使用 create database 数据库名; 创建数据库。

    create database MyDB_one;

    创建数据库成功后,数据库的数量变成了5个,多了刚才创建的 MyDB_one 。

    4. 创建数据库时设置字符编码

    使用 create database 数据库名 character set utf8; 创建数据库并设置数据库的字符编码。

    create database MyDB_two character set utf8;
    

    直接创建的数据库,数据库的编码方式是 MySQL 默认的编码方式 latin1 (单字节编码) ,通常我们会在数据库中存放中文数据,所以最好把数据库的编码方式设置成 utf-8 ,这样中文才能正常显示。

    create database MyDB_three charset utf8;

    character set 可以缩写成 charset ,效果是一样的。

    5. 查看和显示数据库的编码方式

    使用 show create database 数据库名; 显示数据库的创建信息。

    show create database MyDB_one;
    show create database MyDB_two;

    如果不知道一个数据库的编码方式是什么,可以使用 show create database 数据库名 来查看数据库的编码方式。可以看到刚才创建的 MyDB_one 的编码方式是 MySQL 的默认编码 latin1 ,MyDB_two 的编码方式是 utf-8 。

    当然,这种方式不能在创建的同时显示,只能查看一个已经存在的数据库的编码方式。

    6. 使用 alter database 数据库名 character set utf8; 修改数据库编码

    alter database MyDB_one character set utf8;

    如果一个数据库的编码方式不符合使用需求,可以进行修改。刚才创建的 MyDB_one 经过修改后,编码方式也变成了 utf-8 。

    7. 进入或切换数据库

    使用 use 数据库名 进入或切换数据库。

    use MyDB_one
    use MyDB_two;

    刚连接上 MySQL 时,没有处于任何一个数据库中,如果要使用某一个数据库,就需要进入到这个数据库中。

    use 数据库名 这个命令后面的分号可以省略,这是 SQL 语句中唯一可以省略分号的语句。

    8. 显示当前数据库 select database();

    select database();

    进入数据库中,可以使用 select database(); 来查看当前处于哪个数据库中。长时间操作数据库时,在很多数据库中来回切换后,查看当前的数据库,避免操作错了数据库。

    三、创建数据表

    1. 查看当前数据库中的表

    使用 show tables;查看当前数据库中有哪些表。

    show tables;
    

    在刚才创建的数据库 MyDB_one 中,还没有创建任何表,所以当前是空的。

    2. 创建表

    使用 create table 表名(字段1 字段类型,字段2 字段类型,字段3 字段类型,…); 来创建一张表。

    create table Phone_table(pid INT, name CHAR(20), price INT);

    在 MyDB_one 中创建了一个叫 Phone_table 的数据表,这张表有三个字段 pid,name,price 。为了增加 SQL 的可读性,字段名我用的是小写,字段类型用大写。

    3. 显示表信息

    用 show create table 表名; 来显示已创建的表的信息。

    show create table Phone_table;

    使用 show create table 表名;  可以显示表的字段信息, MySQL 的引擎,和默认的字符编码等信息。与显示数据库信息一样,show 只能显示已经创建了的数据表的信息,不能在创建的同时显示信息。

    如果想更好地展示表的字段信息,可以使用 desc 表名; 来显示表的字段信息。

    4. 给表增加字段

    使用 alter table 表名 add 字段名 数据类型; 为已存在的表添加一个新字段。

    alter table Phone_table add color CHAR(20);

    添加后,刚才的表中多了一个字段,新增成功。

    5. 删除表的字段

    使用 alter table 表名 drop 字段名; 删除一个表中已存在的字段。

    alter table Phone_table drop price;

    删除字段后,表中不再有该字段。

    6. 修改字段的数据类型

    使用 alter table 表名 modify 字段名 数据类型; 修改表中现有字段的数据类型。

    alter table Phone_table modify name VARCHAR(12);

    修改之后,该字段的数据类型发生改变。

    7. 修改字段的数据类型并且改名

    使用 alter table 表名 change 原字段名 新字段名 数据类型; 修改表中现有字段的字段名和类型。

    alter table Phone_table change name pname CHAR(18);

    现在,将表的 name 改成了 pname ,同时修改了 pname 的数据类型。

    四、MySQL 常用字段类型

    一个数据表是由若干个字段组成的,一个表十几个字段也很正常,每个字段表示不同的信息,需要使用不同类型的数据。

    所以在创建表的时候,要为每个字段指定适合的数据类型。

    MySQL 中常用的字段类型有以下这些:

    1. 整数类型

    数据类型数据范围
    TINYINT-128 -- 127
    SMALLINT-32768 -- 32767
    MEDIUMINT-2^23 -- 2^23-1
    INT-2^31 -- 2^31-1
    BIGINT-2^63 -- 2^63-1

    2. 字符串类型

    数据类型字节范围用途
    CHAR(n)0 -- 255字节定长字符串
    VARCHAR(n)0 -- 65535字节变长字符串
    TEXT0 -- 65535字节长文本数据
    LONGTEXT0 -- 2^32-1字节极大文本数据
    BLOB0 -- 65535字节二进制长文本数据
    LONGBLOB0 -- 2^32-1字节二进制极大文本数据

    3. 小数类型

    m 表示浮点数的总长度,n 表示小数点后有效位数。

    数据类型数据用法数据范围
    FloatFloat(m,n)7位有效数
    DoubleDouble(m,n)15位有效数
    DecimalDecimal(m,n)28位有效数

    4. 时间类型

    数据类型格式用途
    DATEYYYY-MM-DD日期
    TIMEHH:MM:SS时间
    YEARYYYY年份
    DATETIMEYYYY-MM-DD HH:MM:SS日期和时间
    TIMESTAMP10位或13位整数(秒数)时间戳

    5. 枚举类型

    enum(枚举值1,枚举值2,...)

    枚举类型只能在列出的值中选择一个,如性别。

     

     

    展开全文
  • java 创建线程的三种方式、创建线程池的四种方式

    万次阅读 多人点赞 2019-02-23 21:01:44
    java创建线程的三种方式: 继承Thread类创建线程类 实现Runnable接口 通过Callable和Future创建线程 java创建线程池的四种方式: newCachedThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理...

    概要:

    java创建线程的三种方式:

    1.     继承Thread类创建线程类
    2.     实现Runnable接口
    3.     通过Callable和Future创建线程

       

    java创建线程池的四种方式:

         newCachedThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收,则新建线程

        newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待

        newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行

        newSingleThreadExecutor 创建一个单线程化的线程池,它只会唯一的工作线程来执行任务,保证所有任务按照指定

    顺序(FIFO,LIFO,优先级)执行

     

    线程池的优点:

         a. 重用存在的线程,减少对象创建、消亡的开销,性能佳
         b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
         c. 提供定时执行、定期执行、单线程、并发数控制等功能。

     

    第一 Java中创建线程主要有三种方式:

    1、继承Thread类创建线程类 (extends)

    (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体(线程体)

    (2)创建Thread子类的实例,即创建了线程对象。

    (3)调用线程对象的start()方法来启动该线程。  

      
    public class FirstThreadTest extends Thread{  
        int i = 0;  
        //重写run方法,run方法的方法体就是现场执行体  
        public void run()  
        {  
            for(;i<100;i++){  
            log.info(getName()+"  "+i);  
            }  
        }  
    
        public static void main(String[] args)  
        {  
            for(int i = 0;i< 100;i++)  
            {  
                log.info(Thread.currentThread().getName()+"  : "+i);  
                if(i==20)  
                {  
                    new FirstThreadTest().start();  
                    new FirstThreadTest().start();  
                }  
            }  
        }  
    } 

     

    上述代码中Thread.currentThread()方法返回当前正在执行的线程对象。GetName()方法返回调用该方法的线程的名字。

     

    2、通过Runnable接口创建线程类

    (1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

    (2)创建 Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

    (3)调用线程对象的start()方法来启动该线程。

    public class RunnableThreadTest implements Runnable  
    {  
      
        private int i;  
        public void run()  
        {  
            for(i = 0;i <100;i++)  
            {  
               log.info(Thread.currentThread().getName()+" "+i);  
            }  
        }  
    
        public static void main(String[] args)  
        {  
            for(int i = 0;i < 100;i++)  
            {  
                log.info(Thread.currentThread().getName()+" "+i);  
                if(i==20)  
                {  
                    RunnableThreadTest runner= new RunnableThreadTest();  
                    new Thread(runner,"新线程1").start();  
                    new Thread(runner,"新线程2").start();  
                }  
            }  
        }   
    }  

     

    线程的执行流程很简单,当执行代码start()时,就会执行对象中重写的void run()方法,该方法执行完成后,线程就消亡了。

     

    3、通过Callable和Future创建线程

    (1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值

    public interface Callable
    {
      V call() throws Exception;
    }

    (2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方

    法的返回值。(FutureTask是一个包装器,它通过接受Callable来创建,它同时实现了Future和Runnable接口。)

    (3)使用FutureTask对象作为Thread对象的target创建并启动新线程。

    (4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

    public class CallableThreadTest implements Callable<Integer>  
    {  
      
        public static void main(String[] args)  
        {  
            CallableThreadTest ctt = new CallableThreadTest();  
            FutureTask<Integer> ft = new FutureTask<>(ctt);  
            for(int i = 0;i < 100;i++)  
            {  
                log.info(Thread.currentThread().getName()+" 的循环变量i的值"+i);  
                if(i==20)  
                {  
                    new Thread(ft,"有返回值的线程").start();  
                }  
            }  
            try  
            {  
                log.info("子线程的返回值:"+ft.get());  
            } catch (InterruptedException e)  
            {  
                e.printStackTrace();  
            } catch (ExecutionException e)  
            {  
                e.printStackTrace();  
            }  
      
        }  
      
        @Override  
        public Integer call() throws Exception  
        {  
            int i = 0;  
            for(;i<100;i++)  
            {  
                log.info(Thread.currentThread().getName()+" "+i);  
            }  
            return i;  
        }  
      
    }  

     

    二、创建线程的三种方式的对比

    1、采用实现Runnable、Callable接口的方式创建多线程

          优势:

           线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。

           在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。

           劣势

         编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法

    2、使用继承Thread类的方式创建多线程

          优势:

          编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程

          劣势:

          线程类已经继承了Thread类,所以不能再继承其他父类。

    3、Runnable和Callable的区别

         (1) Callable规定(重写)的方法是call(),Runnable规定(重写)的方法是run()。

         (2) Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。

         (3) call方法可以抛出异常,run方法不可以。

         (4) 运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的

    完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果future.get()。

     

    第二 创建四种线程池的方式

    1、new Thread的弊端

    执行一个异步任务你还只是如下new Thread吗?

    new Thread(new Runnable() {
    
    
      @Override
    
      public void run() {
    
        // TODO Auto-generated method stub
    
        }
    
      }
    
    ).start();

     

    那你就out太多了,new Thread的弊端如下:

         a. 每次new Thread新建对象性能差
         b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom(out of memory)。
         c. 缺乏更多功能,如定时执行、定期执行、线程中断。

    相比new Thread,Java提供的四种线程池的好处在于:

              a. 重用存在的线程,减少对象创建、消亡的开销,性能佳
              b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
              c. 提供定时执行、定期执行、单线程、并发数控制等功能。

    2、Java 线程池

    Java通过Executors提供四种线程池,分别为:

    newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
    newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
    newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
    newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。


    (1) newCachedThreadPool:

    创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:

    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    
      for (int i = 0; i < 10; i++) {
    
        final int index = i;
    
      try {
    
        Thread.sleep(index * 1000);
    
       } catch (InterruptedException e) {
    
          e.printStackTrace();
    
      }
    
    
    
       cachedThreadPool.execute(new Runnable() {
    
         @Override
    
         public void run() {
    
            log.info(index);
    
          }
    
       });
    
    }

    线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

     

    (2) newFixedThreadPool:---  需要指定线程池的大小

    创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
    
      for (int i = 0; i < 10; i++) {
    
      final int index = i;
    
    
      fixedThreadPool.execute(new Runnable() {
    
    
      @Override
    
      public void run() {
     
          try {
             log.info(index);
             Thread.sleep(2000);
          } catch (InterruptedException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
           }
        }
      });
    }

    因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

    定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。可参考PreloadDataCache。

     

    (3)newScheduledThreadPool:

    创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

    ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
    
     scheduledThreadPool.schedule(new Runnable() {
    
    
          @Override
    
          public void run() {
    
             log.info("delay 3 seconds");
           }
    
     }, 3, TimeUnit.SECONDS);

    表示延迟3秒执行。

    定期执行示例代码如下:

    scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
    
          @Override
    
          public void run() {
    
              log.info("delay 1 seconds, and excute every 3 seconds");
    
          }
    
    }, 1, 3, TimeUnit.SECONDS);

    表示延迟1秒后每3秒执行一次。

    ScheduledExecutorService比Timer更安全,功能更强大

     

    (4)newSingleThreadExecutor:

    创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:

    ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
    
    for (int i = 0; i < 10; i++) {
      final int index = i;
      singleThreadExecutor.execute(new Runnable() {
    
        @Override
        public void run() {
        try {
            log.info(index);
            Thread.sleep(2000);
         } catch (InterruptedException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
        }
      });
    }

    结果依次输出,相当于顺序执行各个任务。

    线程池的作用:

    线程池作用就是限制系统中执行线程的数量。

    根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率

    不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没

    有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;

    否则进入等待队列。

    为什么要用线程池:

    1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

    2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大

    约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

    Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的

    线程池接口是ExecutorService。

    比较重要的几个类:

    ExecutorService: 真正的线程池接口。

    ScheduledExecutorService: 能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。

    ThreadPoolExecutor: ExecutorService的默认实现。

    ScheduledThreadPoolExecutor: 继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。

    要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此

    在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

    展开全文
  • 一、创建 Android Studio 工程、 二、创建 Java or Kotlin Library 类型的 Module、 三、改造 Java or Kotlin Library 类型的 Module、 四、编写 Groovy 代码文件并运行、





    一、创建 Android Studio 工程



    在 Android Studio 欢迎界面 , 选择 " Create New Project " 创建新的 Android 应用 ;
    在这里插入图片描述

    默认创建 Module 即可 , 应用的 Module 不能作为 Groovy 开发的工程 , 这里随意即可 , Groovy 开发工程需要额外创建 Java 依赖库 Module , 然后基于 Java 依赖库 Module 进行改造 ;

    在这里插入图片描述

    设置工程名称 , 然后点击 " Finish " 完成设置 ;
    在这里插入图片描述

    新创建的 Android 工程是一个空白工程 ;

    在这里插入图片描述





    二、创建 Java or Kotlin Library 类型的 Module



    选择 " 菜单栏 / File / New / New Module … " 选项 , 在本工程下创建 Module 工程 ;

    在这里插入图片描述

    选择创建 " Java or Kotlin Library " 的 Module ;

    在这里插入图片描述

    创建完后的依赖库 Module ;

    在这里插入图片描述





    三、改造 Java or Kotlin Library 类型的 Module



    原来的 build.gradle 配置 :

    plugins {
        id 'java-library'
    }
    
    java {
        sourceCompatibility = JavaVersion.VERSION_1_7
        targetCompatibility = JavaVersion.VERSION_1_7
    }
    

    配置 Groovy 插件 : 在 plugins 中 , 配置

    id 'groovy'
    

    应用 Groovy 插件 ;


    添加依赖 :

    dependencies {
        implementation localGroovy()
    }
    

    配置完成的支持 Groovy 的 build.gradle :

    plugins {
        id 'java-library'
        id 'groovy'
    }
    
    java {
        sourceCompatibility = JavaVersion.VERSION_1_7
        targetCompatibility = JavaVersion.VERSION_1_7
    }
    
    dependencies {
        implementation localGroovy()
    }
    

    配置完毕后 , 编译该 Module 项目 , 编译成功 ;

    在这里插入图片描述





    四、编写 Groovy 代码文件并运行



    右键点击该 Module 的 main 目录 , 选择 " New / Directory " 选项 ,

    在这里插入图片描述

    可以看到可以创建 groovy 目录 ;

    在这里插入图片描述

    右键点击 Groovy\groovy\src\main\groovy 目录 , 在弹出的菜单中选择 " New / File " 选项 ,

    在这里插入图片描述

    创建 Test.groovy 代码文件 ;

    在这里插入图片描述

    编辑 Test.groovy 代码 :

    class Test {
        // Groovy 中的 main 函数
        def static main(def args) {
            // 在 Groovy 中可以使用 Java 语法
            System.out.println("Hello Groovy !!!")
        }
    }
    

    点击 main 函数左侧的运行按钮 , 运行该程序 , 运行结果如下 :

    在这里插入图片描述

    展开全文
  • 桌面快捷方式可以方便我们快速找到并打开所需要的应用程序,创建桌面快捷方式很简单,以下为菜鸟朋友介绍五种创建桌面快捷方式的方法,高手请飘过。[方法一]第一步:打开“资源管理器”或是“我的电脑”,选中想要...
  • Andriod Studio创建数据库并查看自己创建的数据库 在进行Andriod Studio项目开发时,数据库是必不可少的一环。那么在代码中创建了数据库后,如何查看自己创建的数据库呢?如果能够查看自己的数据库,那将为开发过程...
  • 说一下现在创建Servlet或者是web和之前的主要区别,之前是直接创建,现在是先要创建java项目 然后通过添加支持框架变成Servlet或者web项目 下面这些截图最好都看完,因为有的地方有坑,都在后面的截图里。 我用
  • 如何创建链表?

    万次阅读 多人点赞 2019-07-17 20:11:54
    引言: 最近我们c语言课学到了链表,好多同学都在说:“哇!链表怎么这么难,根本看不懂呀!” 不要怕,在这一篇博客中,...其实创建一个链表也很简单,在我看来,可以分为以下几步: 1.创建头结点。(命名为:head...
  • sql创建表_SQL创建

    万次阅读 2020-07-07 04:14:52
    sql创建表When we have to store data in relational databases, the first part is to create the database. Next step is to create a table in the database that will store our data. In this tutorial, we ...
  • C#创建Excel文件并将数据导出到Excel文件

    千次下载 热门讨论 2014-05-11 00:30:41
    C#创建Excel文件并将数据导出到Excel文件,实现效果及细节参考: http://blog.csdn.net/testcs_dn/article/details/25509249
  • MySQL如何创建用户

    千次阅读 2022-03-15 21:26:42
    创建普通用户,必须有相应的权限来执行创建操作。MySQL提供了三种创建普通的用户方法,分别是create user,grant 和直接操作mysql授权表
  • Numpy简易教程1——创建数组对象

    万次阅读 2021-08-08 22:24:40
    创建数组对象 NumPy提供了两种基本的对象:ndarray(N-dimensional Array Object)和ufunc(Universal Function Object)。 ndarray(下文统一称为数组)是存储单一数据类型的多维数组,而ufunc则是能够对数组进行...
  • android创建wifi热点,手机之间可以互相通信.

    千次下载 热门讨论 2014-12-25 14:55:45
    好东西来了啊,.完整的一套Android通过创建wifi热点,使手机之间可以互相连接,然后获取彼此的ip地址,用socket达到手机之间通信,聊天,发图片,发送文件,不要嫌分多,因为是好东西,.物有所值。
  • git创建分支

    万次阅读 2021-12-09 13:42:27
    创建一个新的分支: 1.进入本地git仓库目录下,打开git bash环境 2.使用git branch命令可以查看到,当前目录只有一个master分支 3.使用命令:git checkout -b dev_v1.0(分支名)创建一个名为admin_v1.0的分支,同时...
  • java中创建文件夹的方法

    千次阅读 2021-03-15 22:53:22
    java中创建文件夹的方法发布时间:2020-06-10 11:46:49来源:亿速云阅读:461作者:Leah这篇文章给大家分享的是java中创建文件夹的方法。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。Java...
  • Intellij IDEA2021.1创建Java web项目(超详细)

    万次阅读 多人点赞 2021-05-16 21:11:58
    接下来,我们在WEB-INF下创建classes,lib文件夹 编辑项目结构 将output path的路径改成classes文件夹的路径 接下来点击dependencies,选择加号,选择jars or directories 点击后,他会弹出一个文件选择框,这里...
  • IDEA2021.2创建java web项目(很详细,手把手创建

    万次阅读 多人点赞 2021-08-19 11:15:21
                    不用maven或者gradle创建java web项目                 忘记了怎么创建web项目 错误示范: 上来直接创建java ee 项目,这样创建出来的项目有Maven或者Gradle包管理...
  • Arcgis 创建渔网

    千次阅读 2021-10-28 17:58:11
    系统工具箱---Data Management Tools→Feature Class→Create Fishnet(数据管理工具---要素类---创建渔网) 如果要素类找不到,则在数据管理工具---采样---创建渔网: 2.创建网格 2.1 以m为单位(例如1km×1km...
  • IDEA中创建maven项目详细步骤,很清晰

    万次阅读 多人点赞 2021-02-25 17:07:23
    在IDEA中创建Maven项目,前提是已经安装配置好Maven环境 。如还未配置安装Maven的,请先下载安装。 1 IDEA中配置Maven 打开IDEA 创建一个新的project 起名为web_work 首先打开IDEA 选择File --> Settings --...
  • Linux如何创建用户

    千次阅读 2022-03-01 13:19:27
    useradd:用于创建新的系统用户 语法:useradd[选项] 用户名 选项:-d 指定用户的家目录(默认用户名目录为/home/用户名,root 用户名家目录是/root) -g 指定用户所属组 -m 不自动建立用户登录的目录(默认的用户...
  • 如何用IDEA创建SpringBoot项目

    千次阅读 多人点赞 2022-04-07 11:36:39
    一般来说,用IDEA创建SpringBoot项目有两种方式。其一是Spring官网提供了一个快速生成SpringBoot项目的网站,可以在官网直接下载后,再导入IDEA中。另外一种是直接用IDEA创建一个SpringBoot项目,一般开发也是用的...
  • python创建文件夹

    千次阅读 2021-08-15 21:06:24
    文章目录方法介绍方法实现 本方法转载自博客园 ...方法介绍 建立实参path指定的文件夹 首先去掉path字符串前面的空格和尾部的“\” ... 创建指定的文件夹 :param path: 文件夹路径,字符串格式 :retu
  • 线程创建的四种方式

    万次阅读 多人点赞 2018-03-30 14:34:14
    java中创建线程的四种方法以及区别 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用四种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线程...
  • linux创建用户组命令

    千次阅读 2021-05-09 04:05:48
    Linux 系统是下可以通过命令创建用户,当然也可以创建用户组,下面由学习啦小编为大家整理了linux创建用户组命令的相关知识,希望对大家有帮助!linux下创建用户组命令——groupadd命令其格式如下:代码:groupadd ...
  • clickhouse创建数据库以及表

    万次阅读 2021-01-08 18:55:46
    创建数据库 语法 CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)] 例子 CREATE DATABASE IF NOT EXISTS chtest; --使用默认库引擎创建库 默认情况下,ClickHouse使用的...
  • python创建数组

    千次阅读 2021-04-25 22:29:12
    NumPy模块提供了多种创建数组的方法,创建的数组类型也有多种多样,下面列举一下创建数组的方法: 1.使用array()函数创建数组 函数可基于序列型的对象(如列表、元组、集合等,还可以是一个已经创建好的数组) #...
  • pandas创建DataFrame的几种方式 如果你是一个pandas初学者,那么不知道你会不会像我一样。在学用列表或者数组创建DataFrame时理不清怎样用数据生成以及想要形状的的Dataframe,那么,现在,你不用自己琢磨了,我这里...
  • Numpy简易教程5——创建NumPy矩阵

    万次阅读 2021-08-12 19:54:21
    创建NumPy矩阵 NumPy对于多维数组的运算,默认情况下并不进行矩阵运算。如果需要对数组进行矩阵运算,则可以调用相应的函数。 在NumPy中,矩阵是ndarray的子类。 在NumPy中,数组和矩阵有着重要的区别。NumPy提供了...
  • MySQL入门:如何创建数据库?

    万次阅读 多人点赞 2021-05-26 09:36:05
    本文详细概述了如何使用不同的方法和工具(包括用于MySQL的命令行,工作台和dbForge Studio)在MySQL中创建数据库。 MySQL是基于SQL的关系数据库管理系统。它是由Oracle Corporation开发,分发和支持的。MySQL是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,751,075
精华内容 5,100,430
关键字:

创建