Object类是所有类的祖先类。
线程加锁示例
定时器||闹钟
//定时器,闹钟
import java.util.Timer;
import java.util.TimerTask;
public class UserTime {
private static class MyTimerTask1 extends TimerTask {
@Override
public void run() {
System.out.println("该起床了!");
}
}
/*private static class MyTimerTask2 extends TimerTask {
@Override
public void run() {
System.out.println("该洗脸了!");
}
}*/
/*private static class MyTimerTask3 extends TimerTask {
@Override
public void run() {
System.out.println("该刷牙了!");
}
}*/
public static void main(String[] args) {
Timer timer=new Timer();
timer.schedule(new MyTimerTask1(),5000);//在指定的延迟之后安排指定的任务执行
timer.scheduleAtFixedRate(new MyTimerTask1(),1000,1000);
//在指定的延迟之后 开始 ,重新执行 固定速率的指定任务
/*timer.schedule(new MyTimerTask2(),10000);
timer.schedule(new MyTimerTask3(),5000);*/
}
}
线程池技术:一次有多个线程,等任务来了,哪个线程有时间,哪个线程就执行该任务。当线程足够多了,但任务还很多那么剩余的任务会被放到队列里;如果线程足够多,且队列也满了,可以抛异常或者回调函数。
package pool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class UsePool {
public static void main(String[] args) {
//相当于一开始这个线程池就有1个任务,需要1个线程,若有多的线程就得放在队列里
ExecutorService pool=Executors.newFixedThreadPool(1);//已创建好一个线程池
//接下来该让它执行任务
pool.execute(new Runnable(){
@Override
public void run() {
while(true){
System.out.println("我是第一个线程");
}
}
});
pool.execute(new Runnable(){
@Override
public void run() {
while(true){
System.out.println("我是第二个线程");
}
}
});
}
}
//内部有线程池执行任务,仅仅要给它提交的是任务,不再去管具体的线程
//线程的创建和释放线程池去实现
来源:CSDN
作者:苏羨
链接:https://blog.csdn.net/qq_44847147/article/details/104501658