线程
(接上篇)
这一章东西比较多。
8.守护线程
java中线程分为两大类:
一类是:用户线程
一类是:守护线程(后台线程)
其中最具代表性的就是:垃圾回收线程(守护线程)
守护线程特点:
一般守护线程是一个死循环,素有的用户线程只要结束,守护线程自动结束。
注意:主线程main方法是一个用户线程。
package 线程;
public class 线程守护 {
public static void main(String[] args) {
Thread t0 = new Thread(new MyThread01(), "t-0");
t0.setDaemon(true);//设置t0为守护线程
t0.start();
for (int i = 0; i < 3; i++) {
System.out.println("main" + "-->" + (i));
}
}
}
class MyThread01 implements Runnable {
@Override
public void run() {
int i = 0;
while (true) {
System.out.println(Thread.currentThread().getName() + "-->" + (++i));
}
}
}
9.定时器
定时器作用:
间隔特定的时间,执行特定的程序。 java中可以采用多种方式来实现:
1.可以使用sleep方法,睡眠,设置睡眠时间,每到这个时间点醒来,执行任务,这种方 式最为原始。
2.在java类库中,已经写好一个定时器,java.util.Timer,可以直接拿来用,但是不常用,因为 很多框架支持定时任务,目前使用较多的是Spring框架中提供的SpringTask框架。这个框架 只要进行简单配置,就可以实现定时器的任务。
代码
package 线程;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimeTest {
public static void main(String[] args) throws Exception {
//创建定时器对象
Timer timer = new Timer();
//Timer timer = new Timer(true); //守护线程的方式
//指定定时任务
//timer.schedule(定时任务,第一次执行时间,间隔多久执行一次);
//获取时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date firstTime = sdf.parse("2021-04-18 13:44:00");
timer.schedule(new LogTimerTask(), firstTime, 1000 * 10);
}
}
//编写一个定时任务类
//假设这是一个记录日志的定时任务
class LogTimerTask extends TimerTask {
@Override
public void run() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strTime = sdf.format(new Date());
System.out.println(strTime + " :成功完成了一次数据备份");
}
}
运行结果:
这边顺带提一下,获取时间方法:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date firstTime = sdf.parse("2021-04-18 13:44:00");
10.实现线程的第三种方式:实现Callable接口
这种方式实现的线程可以获取线程的返回值。
//第一步 创建一个未来任务类对象
//第二步 创建Thred线程
//第三步 启动线程
//第四步 获取线程返回值
package 线程;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class 线程带返回值方式 {
public static void main(String[] args) throws Exception {
//第一步 创建一个未来任务类对象
FutureTask task = new FutureTask(new Callable() {
@Override
public Object call() throws Exception {
return 1;
}
});
//第二步 创建Thred线程
Thread t = new Thread(task);
//第三步 启动线程
t.start();
//第四步 获取线程返回值
Object obj = task.get();//这个获取返回值,必须要等run方法结束,所以有可能造成主程序的堵塞
}
}
11.关于Object类中的Wait和notify方法
基于对象使用!
11.1、wait()作用
Object o = new Object();
o.Wait();
/*表示:
**让正在o对象上活动的线程进入等待状态,无期限等待
**直到利用notify方法唤醒为止
*/
11.2、notify()方法作用
Object o = new Object();
o.notify();
/*表示:
**唤醒正在o对象上的等待线程
*/
//还有一个notifyAll()方法
//表示唤醒o对象上处于等待的所有进程
方法理解图