匿名内部类方式实现多线程程序以及定时器的使用
在前面的文章中,我们已经讨论了创建多线程的三种方式:
- 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多线程中最基本的知识,但也很常用,只有掌握了这些基础知识,后面的学习才不会太费劲。