JavaSE学习笔记 匿名内部类方式实现多线程程序以及定时器的使用

匿名内部类方式实现多线程程序以及定时器的使用


在前面的文章中,我们已经讨论了创建多线程的三种方式:

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

其实在代码实现过程中,当创建的线程只用一次,可以通过匿名内部类来实现创建多线程。

其次我们介绍下Java中的定时器,可用于调用多个定时任务,以后台线程方式执行。


1.匿名内部类方式实现多线程程序

匿名内部类的方式实现多线程程序方式一: new Thread(){代码…}.start();

public class MyTest {
    public static void main(String[] args) {
      //匿名内部类创建多线程
       new  Thread(){
           @Override
           public void run() {
               System.out.println("线程开启");
           }
       }.start();



       //匿名内部类创建多线程对象,可以为多线程变量命名
      Thread th1= new Thread(){
           @Override
           public void run() {
               System.out.println(Thread.currentThread().getName()+"开启");
           }
       };
      th1.setName("线程A");
      th1.start();

    }
}

  • 程序运行后为:
    在这里插入图片描述
    这样表示通过匿名内部类的方式实现多线程程序方式一: new Thread(){代码…}.start();开启多线程成功。

匿名内部类的方式实现多线程程序方式二:new Thread(new Runnable(){代码…}).start();

public class MyTest2 {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程开启");
            }
        }).start();


      Thread th2=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"开启");
            }
        });

      th2.setName("线程B");
      th2.start();

    }
}

  • 程序运行后为:
    在这里插入图片描述
    这样表示通过匿名内部类的方式实现多线程程序方式二: new Thread(new Runnable(){代码…}).start();开启多线程成功。

2.定时器的概述和使用

  • 定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行。
Timer定时器的常用方法方法含义
Timer.schedule(TimerTask task, Date time)安排在指定的时间执行指定的任务。
void Timer.schedule(TimerTask task, Date firstTime, long period)安排指定的任务在指定的时间开始进行重复的固定延迟执行。
void Timer.schedule(TimerTask task, long delay)安排在指定延迟后执行指定的任务。
void Timer.schedule(TimerTask task, long delay, long period)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
TimerTask的常用方法方法含义
public abstract void run()TimerTask本质上一个线程,在实现定时任务时需要实现run()方法
public bolean cancel()取消定时任务
import java.util.Timer;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask {
    private Timer timer;

    public MyTimerTask(Timer timer) {
        this.timer = timer;
    }

    @Override
    public void run() {
        System.out.println("定时器的定时任务开始执行");
        timer.cancel();
    }
}


import java.util.Timer;
import java.util.TimerTask;

public class MyTest {
    public static void main(String[] args) {
        //定时器:可以在指定时间,执行定时任务
        Timer timer = new Timer();
        //类TimerTask由Timer安排为一次执行或者重复执行的任务
        MyTimerTask myTimerTask = new MyTimerTask(timer);
        //将设置的任务传入定时器中,并进行延迟的处理
        timer.schedule(myTimerTask,100);
        //取消定时器的任务
         //myTimerTask.cancel();
        //取消定时器
       // timer.cancel();


    }
}

上面的代码中需要注意的是:
myTimerTask.cancel()指的是取定时的myTimerTask()任务
而timer.canel()指的是终止此定时器,丢弃所有当前已安排的任务


  • void Timer.schedule(TimerTask task, long delay, long period) :安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
import java.util.Timer;
import java.util.TimerTask;

public class MyTest2 {
    public static void main(String[] args) {
        Timer timer = new Timer();
        //第一次等待3秒进行执行,以后每间隔100ms进行执行定时任务
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("此定时炸弹爆炸");
            }
        },1000*3,100);

    }
}

  • 程序执行的结果为:

在这里插入图片描述


  • Timer.schedule(TimerTask task, Date time) 安排在指定的时间执行指定的任务
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class MyTest3 {
    public static void main(String[] args) throws ParseException {
        //Timer.schedule(TimerTask task, Date time)  安排在指定的时间执行指定的任务
        Timer timer = new Timer();
        String datestr="2021-02-07 21:15:00";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = simpleDateFormat.parse(datestr);

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("爱生活,爱JAVA");
            }
        },date);
    }
}


  • 当时间到达2021-02-07 21:15:00时,定时器会执行爱生活,爱JAVA这个字符串,运行后的结果为:

在这里插入图片描述


  • void Timer.schedule(TimerTask task, Date firstTime, long period): 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class MyTest4 {
   public static void main(String[] args) throws ParseException {
       //void Timer.schedule(TimerTask task, Date firstTime, long period)
       // 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
       Timer timer = new Timer();
       String dataStr="2021-02-07 21:41:00";
       SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

       Date date = simpleDateFormat.parse(dataStr);

       timer.schedule(new TimerTask() {
           @Override
           public void run() {
               System.out.println("发送邮件");

           }
       },date,1000);
   }
}

  • 当时间到达2021-02-07 21:41:00时,定时器会执行发送邮件这个字符串,且之后每隔1s执行一次,运行后的结果为:

在这里插入图片描述


利用定时器定时删除多级文件夹

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class MyTest {
    public static void main(String[] args) throws ParseException {
        Timer timer = new Timer();
        //定义定时器时间的字符串
        String datastr = "2021-01-21 22:13:00";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //利用SimpleDateFormat将时间字符串转换称时间
        Date date = simpleDateFormat.parse(datastr);

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                //定时删除多级文件夹
                File file = new File("C:\\Users\\zlb\\Desktop\\aaaa");
                if (!file.exists()) {
                    file.mkdirs();
                }
                deleteDir(file);
            }


            private  void deleteDir (File file){
                File[] files = file.listFiles();
                for (File file1 : files) {
                    if (file1.isFile()) {
                        file1.delete();
                    } else {
                        deleteDir(file1);
                    }
                }
                file.delete();
            }

        },date);

    }
}


总结

本节关于匿名内部类创建多线程程序以及定时器的操作,都是Java多线程中最基本的知识,但也很常用,只有掌握了这些基础知识,后面的学习才不会太费劲。

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值