java 学习 day24 线程池 定时器 设计模式

24.00_线程间的等待唤醒机制

Object 类中
  void wait ()  在其他线程调用此对象的 notify () 方法或 notifyAll () 方法前,导致当前线程等待。
       
 void wait (long timeout) 在其他线程调用此对象的 notify () 方法或 notifyAll () 方法,或者超过指定的时间量前,导致当前线程等待。
 
   void notify () 唤醒在此对象监视器上等待的单个线程。
        
    void notifyAll ()  唤醒在此对象监视器上等待的所有线程。    

24.01_多线程(内存可见性问题 volatile)

volatile 解决内存可见性问题
	 一、Java内存模型
	 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的。
	 Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存,
	 线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来)。
	 线程对变量的所有操作(读取,赋值)都必须在工作内存中进行。
	 不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

	 3.Java中的可见性
	
	 对于可见性,Java提供了volatile关键字来保证可见性。
	 当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
	 而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,
	 当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
	 另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,
	 并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。
	 
volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见。
 	           相较于 synchronized 是一种较为轻量级的同步策略。
               
volatile 变量,用来确保将变量的更新操作通知到其他线程。
可以将 volatile 看做一个轻量级的锁,但是又与
锁有些不同:
 对于多线程,不是一种互斥关系
 不能保证变量状态的“原子性操作”               

24.03_多线程(线程的状态转换图及常见执行情况)

: 新建 , 就绪 , 运行 , 冻结 , 死亡
   新建:线程被创建出来
   就绪:具有CPU的执行资格,但是不具有CPU的执行权
   运行:具有CPU的执行资格,也具有CPU的执行权
   阻塞:不具有CPU的执行资格,也不具有CPU的执行权
   死亡:不具有CPU的执行资格,也不具有CPU的执行权

24.05_多线程(匿名内部类的方式实现多线程程序)

A:案例演示
	匿名内部类的方式实现多线程程序
	
	new Thread(){代码…}.start();
	new Thread(new Runnable(){代码…}).start();

public class MyTest2 {
    public static void main(String[] args) {
        //采用你们内部类,来开启线程
        //方式1:
        new Thread(){
            @Override
            public void run() {
                System.out.println("线程执行了");
            }
        }.start();

        Thread th=new Thread() {
            @Override
            public void run() {
                System.out.println("线程执行了");
            }
        };
        th.start();

        //方式2
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程执行了2");
            }
        }).start();
    }
}

24.06_多线程(定时器的概述和使用)

A:定时器概述
	定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行。
	在Java中,可以通过Timer和TimerTask类来实现定义调度的功能。
B:Timer和TimerTask
	Timer:
		public Timer()
		public void schedule(TimerTask task, long delay):	
		public void schedule(TimerTask task,long delay,long period);
		public void schedule(TimerTask task,  Date time):
		public void schedule(TimerTask task,  Date firstTime, long period):
	TimerTask:定时任务
		public abstract void run()
		public boolean cancel()
	开发中
		Quartz是一个完全由java编写的开源调度框架。
C:案例演示:	定时器的使用
import java.util.Timer;
import java.util.TimerTask;


public class MyTimerTask extends TimerTask {
    Timer timer;
    public MyTimerTask(Timer timer) {
        this.timer=timer;
    }

    @Override
    public void run() {
        System.out.println("~~~~砰!爆炸了");
        timer.cancel();
    }
}

import java.util.Timer;


public class MyTest {
    public static void main(String[] args) {
        //定时器 Timer
        //一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。
        Timer timer = new Timer();
       // public void schedule (TimerTask task,long delay):
        //延迟多少毫秒之后,让定时任务执行
        MyTimerTask myTimerTask = new MyTimerTask(timer);
        timer.schedule(myTimerTask,2000);

        //timer.cancel(); 取消定时器

    }
}

24.07_多线程(定时器的练习)

A:案例演示
	定时任务的多次执行代码体现
	定时删除指定的带内容目录


public class MyTimerTask extends TimerTask {
    Timer timer;
    public MyTimerTask(Timer timer) {
        this.timer=timer;
    }
    @Override
    public void run() {
        File file = new File("E:\\测试图片");
        delFolder(file);
        timer.cancel();//取消定时器
    }
    private void delFolder(File file) {
        File[] files = file.listFiles();
        for (File f : files) {
            if(f.isFile()){
               f.delete();
            }else{
                delFolder(f);
            }
        }
        file.delete();
    }
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;


public class MyTest3 {
    public static void main(String[] args) throws ParseException {
        //定时删除文件夹
        Timer timer = new Timer();
        String dateStr = "2019-07-30 14:42:00";
        Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateStr);
        MyTimerTask myTimerTask = new MyTimerTask(timer);
        timer.schedule(myTimerTask,date);

    }
}

24.09_设计模式(设计模式的概述和分类)

A:设计模式概述
	设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编写、代码设计经验的总结。
	使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性以及代码的结构更加清晰.
B:设计模式分类
	创建型模式(创建对象的):	单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
	行为型模式(对象的功能):	适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
	结构型模式(对象的组成):	模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

24.13_设计模式(单例模式之懒汉式)

A:案例演示:	单例模式之懒汉式
B:饿汉式和懒汉式的区别
	
		单例设计模式之懒汉式

 		开发中		饿汉式
 		面试中		懒汉式
public class Student {
//懒汉式
    private static Student student=null;
    private Student(){

    }
    public synchronized static Student getStudent(){
        if(student==null)
        {
            student =new Student();
        }
        return student;
    }
}

public class Teacher {
    //饿汉式
    private static Teacher teacher=new Teacher();
    private Teacher(){

    }
    public static Teacher getTeacher(){
        return teacher;
    }
}

24.14_设计模式(单例模式的Java代码体现Runtime类)

A:Runtime类概述
	每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。 
	应用程序不能创建自己的 Runtime 类实例。 
B:案例演示:	public Process  exec(String command)  //执行Dos 命令
C:查看Runtime的源码:		发现是单例模式的应用
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Timer;
import java.util.TimerTask;

public class MyTest2 {
    public static void main(String[] args) throws ParseException {
        Runtime runtime=Runtime.getRuntime();
        Timer timer=new Timer();
        timer.schedule(new TimerTask(){
            public void run(){
                try{
                    runtime.exec("");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        },new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-07-30 16:06:00"));
    }
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值