ACAC 定时器,守护线程,Callable接口

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("主线程的输出");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44707513/article/details/110832484
今日推荐