package Two;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/*
* 使用定时器指定定时任务:
* 语法:timer.schedule(new Data01(),date,5000);
* */
public class TimerTest01 {
public static void main(String[] args) {
//创建定时器对象
Timer timer = new Timer();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/*try {
Date date = sdf.parse("2020-12-7 11:19:00");
timer.schedule(new Data01(),date,5000);
} catch (ParseException e) {
e.printStackTrace();
}*/
//也可以使用匿名内部类
try {
Date date = sdf.parse("2020-12-7 11:19:00");
timer.schedule(new TimerTask() {
@Override
public void run() {
SimpleDateFormat time = new SimpleDateFormat("yyyy-MM--dd HH:mm:ss ");
String dd = time.format(new Date());
System.out.println("时间:" + dd + "" + Thread.currentThread().getName() + "完成备份");
}
}, date, 5000);
} catch (ParseException e) {
e.printStackTrace();
}
// 时间:2020-12--07 12:25:57 Timer-0完成备份
// 时间:2020-12--07 12:26:02 Timer-0完成备份
// 时间:2020-12--07 12:26:07 Timer-0完成备份
}
}
/*class Data01 extends TimerTask {
@Override
public void run() {
SimpleDateFormat time = new SimpleDateFormat("yyyy-MM--dd HH:mm:ss ");
//Date dd = new Date();这样输出的是默认格式的时间
//时间:Mon Dec 07 11:14:00 CST 2020Timer-0完成备份
String dd = time.format(new Date());
System.out.println("时间:" + dd + "" + Thread.currentThread().getName() + "完成备份");
}
}*/
package Two;
/*
* 守护线程.setDaemon(true)
* */
public class ThreadTest11 {
public static void main(String[] args) {
Thread dd = new DataBase();
dd.setName("守护线程,数据备份");
//启动线程之前,将线程设置为守护线程
dd.setDaemon(true);
dd.start();
//主线程,也就是用户线程
for (int i = 0; i < 11; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "---->" + i);
}
}
}
class DataBase extends Thread{
int i = 0;
@Override
public void run() {
//守护线程即使是死循环也会终止的
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "---->" + i++);
}
}
}
package Two;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
//JUC包下的,属于java的并发包,老JDk中没有这个包,新特性
/*
* 实现线程的第三种方式:
* 实现Callable接口
* */
public class CallableTest {
public static void main(String[] args) {
//创建一个“未来任务类”对象
FutureTask ft = new FutureTask(new Callable() {
@Override
public Object call() throws Exception {//call方法相当于run方法,不过可以有返回值
//线程执行一个任务,执行之后可能会有一个执行结果
System.out.println("分支开始线程执行");
Thread.sleep(1000 * 5);
return 100;
}
});
//创建线程对象
Thread tt = new Thread(ft);
tt.start();
//这里是main方法,主线程,主线程中怎么获取分支线程的返回值
//get()方法的执行会导致“当前线程阻塞”
try {
Object obj = ft.get();
System.out.println("分支线程执行结果:" + obj);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
//main方法这里的程序要想值吸引必须等待get()方法的结束
//get()方法可能需要很久,因为get()方法是为了拿另一个线程的执行结果,另一个线程执行需要时间
//缺点:效率比较低。优点:有返回值
System.out.println("主线程的输出");
}
}