线程的常用方法,Object提供wait()等线程操作-生产者与消费者模式设计,枚举,线程的声明周期,线程池,单例设计模式,定时器

一、线程的常用方法

1.1 方法的介绍

在这里插入图片描述

  1. 定义一个线程类
package qf22020309_consumer_producer;

public class MyThread01 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+" "+i);
        }
    }
}

1.2 stop终止该线程

package qf22020309_consumer_producer;

public class Demo01 {
    public static void main(String[] args) {
        MyThread01 mt1 = new MyThread01();
        mt1.start();
        //停止线程,不会执行停止
        mt1.stop();
        MyThread01 mt2 = new MyThread01();
        mt2.start();
    }
}

1.2 join等待线程执行完终止

package qf22020309_consumer_producer;

public class Demo03 {
    public static void main(String[] args) throws InterruptedException {
        MyThread03 mt1 = new MyThread03();
        mt1.start();
        mt1.join(); //等待mt1线程执行完再终止
        MyThread03 mt2 = new MyThread03();
        mt2.start();
    }
}

1.3 yield礼让线程

package qf22020309_consumer_producer;

public class Demo02 {
    public static void main(String[] args) {
        MyThread02 mt1 = new MyThread02();
        mt1.yield();
        mt1.start(); //礼让mt2线程执行(不一定礼让成功)
        MyThread02 mt2 = new MyThread02();
        mt2.start();
    }
}

二、Object提供wait()等线程操作-生产者与消费者模式设计

2.1 方法的介绍

在这里插入图片描述

2.2 案例应用

  1. 问题:生产者做一个米饭,必须等待消费者吃完才能继续生产,而消费者必须等待生产者生产出来才能吃饭
  2. rice米饭对象
package qf22020309_work.Demo04;

public class Rice {
    private String money;
    private String weight;
    private Boolean flag = false;

    public Rice() {
    }

    public Rice(String money, String weight) {
        this.money = money;
        this.weight = weight;
    }

    public String getMoney() {
        return money;
    }

    public void setMoney(String money) {
        this.money = money;
    }

    public String getWeight() {
        return weight;
    }

    public void setWeight(String weight) {
        this.weight = weight;
    }

    public Boolean getFlag() {
        return flag;
    }

    public void setFlag(Boolean flag) {
        this.flag = flag;
    }

    @Override
    public String toString() {
        return "Rice{" +
                "money='" + money + '\'' +
                ", weight='" + weight + '\'' +
                ", flag=" + flag +
                '}';
    }
}
  1. 生产者
package qf22020309_work.Demo04;

public class MyProducer extends Thread{
    private Rice rice;

    public MyProducer(Rice rice) {
        this.rice = rice;
    }

    @Override
    public void run() {
        while (true){
            synchronized (rice){
                try {
                    Thread.sleep(2500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(rice.getFlag()){
                    try {
                        rice.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                rice.setMoney("12元");
                rice.setWeight("5两米饭");
                rice.setFlag(true);
                System.out.println("我在做着"+rice.getMoney()+",重"+rice.getWeight()+"的米饭");
                rice.notify();
            }
        }
    }
}

  1. 消费者
package qf22020309_work.Demo04;

public class MyConsumer extends Thread {
    private Rice rice;

    public MyConsumer(Rice rice) {
        this.rice = rice;
    }

    @Override
    public void run() {
        while (true){
            synchronized (rice){
                try {
                    Thread.sleep(2500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(!rice.getFlag()){
                    try {
                        rice.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("我在吃"+rice.getMoney()+",重"+rice.getWeight()+"的米饭");
                rice.setMoney(null);
                rice.setWeight(null);
                rice.setFlag(false);
                rice.notify();
            }
        }
    }
}

  1. 测试类
package qf22020309_work.Demo04;

public class Test01 {
    public static void main(String[] args) {
        Rice rice = new Rice();
        new MyProducer(rice).start();
        new MyConsumer(rice).start();
    }
}

2.3 生产者与消费者设计总结

  1. wait()方法是让自身的线程等待,给其它的线程(需锁的相同对象)有抢夺cpu的执行权的权力
  2. notify是通知此监听器(相同对象)对象上等待的单个线程执行,notifyAll是通知此监听器(相同对象)对象上等待的全部线程执行
  3. 案例总结:
  4. 该案例没有使用资源共享,而只使用了synchronized锁的对象
  5. 两者锁的对象相同,消费者必须等待生产者生产出来了才能吃饭,这个等待时间是无限的,所以使用wait(),礼让等待生产者线程生产,生产者相同
  6. 等待生产者做好了,再发通知,消费者相同,所用使用notify()
  7. 必须锁的相同的对象

三、枚举

3.1 概念

  1. 枚举就是用于表示一些固定的值,可以使用枚举项类进行
  2. 访问修饰 enum 枚举类的名称{
  3.      枚举项
    
  4. }

3.2 特点

  1. 每一个枚举类都是Enum的子类
  2. 每一个枚举项都是一个对象
  3. 枚举类只能有私有的构造
  4. 枚举项一般都是写在第一行,每个枚举项必须重写本类中的抽象方法,可以定义成员变量
package qf22020309_enum.Demo01;

public enum MyEnum {
    re {
        @Override
        public void add() {

        }
    }, rs {
        @Override
        public void add() {

        }
    };
    private String name;

    public String name1;

    MyEnum() {
    }

    private MyEnum(String name, String name1) {
        this.name = name;
        this.name1 = name1;
    }

    public static void get() {
    }

    public void get1() {
    }

    public abstract void add();
}

四、线程的声明周期

4.1 线程状态图

  1. 线程的生命周期有几种状态
  2. 获取状态:Thread.State
    在这里插入图片描述

4.2 6种状态

  1. NEW:至今尚未启动的线程
  2. RUNNABLE:正在java虚拟机中执行的线程
  3. BLOCKED:受阻塞并等待某个监视器锁的线程
  4. WAITING:无限期的等待另一个线程去执行操作的线程
  5. TIMED_WAITING:等待另一个线程去执行,取决于指定等待的时间的线程
  6. TERMINATED:已退出的线程处于这种状态
package qf22020308_thread.Demo03;

public class Demo02 {
    public static void main(String[] args) {
        Thread thread = new Thread();
        System.out.println(thread.getState());
        thread.start();
        System.out.println(thread.getState());
        /**
         * 结果:
         * NEW
         * RUNNABLE
         */
    }
}

五、线程池

5.1 简介

  1. 没有线程池的问题:A.需要反复的创建销毁 B.大量的的线程不便于管理 C.遭到破坏性较大的的任务,可能会导致线程任务失败
  2. 线程池:A.jdk提供的线程池,可以使用线程池来的对线程进行统一的管理 B. 避免反复的创建和销毁 C. 遇到破坏性较大的任务时,线程任务执行失败后,线程池会重新派线程去执行为,确保任务的执行操作

5.2 创建线程池对象的方法

  1. Executors 线程工具类调用
  2. 调用单一线和多线程对象获取方法图在这里插入图片描述
  3. 提交任务有返回值和无返回值在这里插入图片描述

5.2 案例

  1. 单一线程有返回值-代码实例
package qf22020309_ThreadPool.Demo01;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        return 520;
    }
}

package qf22020309_ThreadPool.Demo01;

import java.util.concurrent.*;

/**
 * 单个线程加入线程池并启动线程
 */
public class Test01 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallable mc = new MyCallable();
        ExecutorService es = Executors.newSingleThreadExecutor();
        Future<Integer> submit = es.submit(mc);
        System.out.println(submit.get());
    }
}

  1. 多线程无返回值-代码实例
package qf22020309_ThreadPool.Demo02;

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("runnable");
    }
}

package qf22020309_ThreadPool.Demo02;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Test02 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService es = Executors.newFixedThreadPool(3);
        es.submit(new MyRunnable());
        es.submit(new MyRunnable());
        es.submit(new MyRunnable());
        es.submit(new MyRunnable());
    }
}

六、单例设计模式

  1. 单例设置模式的特点:有且仅实例化一个对象
  2. 使用场景:加载配置信息、工具类、spring、容器对象等
  3. 私有属性、私有构造方法、公有的方法

6.1 懒汉设计模式

  1. 优点:项目启动时,不可能出现卡顿现象
  2. 缺点:没有锁的机制,多线程不安全
  3. 定义类
package qf22020309_design.Demo01;

public class MyDesign {
    //私有属性
    private static MyDesign md;

    //私有构造方法
    private MyDesign() {
    }

    //公开拿取对象的方法
    public static MyDesign getInstance() {
        if (md == null) {
            md = new MyDesign();
        }
        return md;
    }
}

  1. 测试类
package qf22020309_design.Demo01;

/**
 * 懒汉设计模式:随用随创建
 */
public class Demo01 {
    public static void main(String[] args) {
        System.out.println(MyDesign.getInstance());
        System.out.println(MyDesign.getInstance());
    }
}

6.2 饿汉设计模式

  1. 优点:没有锁的机制、效率比较高
  2. 缺点:项目启动时就创建对象,项目可能会出现卡顿,多线程不安全
  3. 定义类
package qf22020309_design.Demo02;

public class MyDesign {
    //加载开始创建好的对象
    private static MyDesign p = new MyDesign();
    //私有构造方法
    private MyDesign(){};
    //获取对象
    public static MyDesign getInstance(){
        return p;
    }
}

  1. 测试类
package qf22020309_design.Demo02;

/**
 * 饿汉设计模式:创建好
 */
public class Demo01 {
    public static void main(String[] args) {
        System.out.println(MyDesign.getInstance());
        System.out.println(MyDesign.getInstance());
    }
}

6.3 双重锁设计模式

  1. 代码实例
package qf22020309_design.Demo04;

public class Utils {
    private static Utils utils;

    private Utils() {
    }
    public static synchronized Utils GetInstance(){
        if(utils==null){
            synchronized (Utils.class){
                if(utils==null){
                    return utils = new Utils();
                }
            }
        }
        return utils;
    }
}

6.4 内部类模式

package qf22020309_design.Demo04;

public class Utils {

    private Utils() {
    }

    static class Instance {
        static final Utils UTILS = new Utils();
    }

    public static Utils getInstance() {
        return Instance.UTILS;
    }
}

七、定时器

7.1 设计定时读取文件的内容

  1. 自定义类
package qf22020309_work.Demo01;

import java.io.*;
import java.util.TimerTask;

public class MyTask extends TimerTask {

    @Override
    public void run() {
        InputStreamReader isr = null;
        try {
            isr = new InputStreamReader(new FileInputStream("D:\\test.txt"));
            int temp;
            char[] ch = new char[1024*1024];
            while ((temp=isr.read(ch))!=-1){
                System.out.print(new String(ch, 0, temp));
            }
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(isr!=null){
                    isr.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

  1. 测试类
package qf22020309_work.Demo01;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.util.Timer;

/**
 * 定时器
 * 定时读取文件内容
 */
public class Demo01 {
    public static void main(String[] args) throws ParseException {
        //自定义类MyTask实现TimerTask类
        //TimerTask是Runnable的实现类
        MyTask mt = new MyTask();
        //实例化一个Timer对象
        Timer t = new Timer();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入读取文件的时间:");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date parse = sdf.parse(sc.nextLine());
        //传入执行对象、执行的时间(也可以添加重复执行间隔时间)
        t.schedule(mt, parse);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT阿生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值