IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 大数据学习第17天 -> 正文阅读

[大数据]大数据学习第17天

售票窗口

public class Demo1 {
    public static void main(String[] args) {
        Demo2 demo2 = new Demo2();
        Thread t1 = new Thread(demo2, "窗口1");
        Thread t2 = new Thread(demo2, "窗口2");
        Thread t3 = new Thread(demo2, "窗口3");
        Thread t4 = new Thread(demo2, "窗口4");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

public class Demo2 implements Runnable {
    int ticket = 100;
    @Override
    public void run() {
        while (ticket>0){
            //显示出票时间
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //显示卖票号码
            System.out.println(Thread.currentThread().getName()+":正在买票:"+ticket--);
        }
    }
}

此时这样会出现线程不安全的问题

public class Demo1 {
    public static void main(String[] args) {
        Demo2 demo2 = new Demo2();
        Thread t1 = new Thread(demo2, "窗口1");
        Thread t2 = new Thread(demo2, "窗口2");
        Thread t3 = new Thread(demo2, "窗口3");
        Thread t4 = new Thread(demo2, "窗口4");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

//同步代码块
public class Demo2 implements Runnable {
    //实例化对象,用于创建锁对象
    final static Object o = new Object();
    int ticket = 100;
    @Override
    public void run() {
        synchronized (o) {
            while (ticket > 0) {
                //显示出票时间
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //显示卖票号码
                System.out.println(Thread.currentThread().getName() + ":正在买票:" + ticket--);
            }
        }
    }
}

//同步方法
public class Demo2 implements Runnable {
    //实例化对象,用于创建锁对象
    final static Object o = new Object();
    int ticket = 100;
    @Override
    public void run() {
        //调用show方法
        show();
    }
//        创建一个锁方法
    public synchronized void show(){
        while (ticket > 0) {
            //显示出票时间
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //显示卖票号码
            System.out.println(Thread.currentThread().getName() + ":正在买票:" + ticket--);
        }
    }
}

public class Demo1 {
    public static void main(String[] args) {
        Demo2 demo2 = new Demo2();
        Thread t1 = new Thread(demo2, "窗口1");
        Thread t2 = new Thread(demo2, "窗口2");
        Thread t3 = new Thread(demo2, "窗口3");
        Thread t4 = new Thread(demo2, "窗口4");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

//死锁

要产生死锁起码要产生两个锁才会有可能产生死锁,而在Java中使用多线程都会产生死锁
public class Demo1 {
    public final static String A="a";
    public final static String B="b";
    public static void main(String[] args) {
        //创建两个锁机制

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (A) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("线程A----拥有A锁");
                    synchronized (B) {
                        System.out.println("线程A-----拥有B锁");
                    }
                }
            }

        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (B){
                    System.out.println("线程B--------拥有B锁");
                    synchronized (A){
                        System.out.println("线程B-------拥有A锁");
                    }
                }
            }
        }).start();
    }
}
//而此时这种状况就会出现死锁

包子铺案例

//吃包子,说明要有包子资源
public class BaoZi {
    //包子里面有包子皮,包子馅,和包子是否存在的状态
    String pier;
    String xianer;
    boolean flag = false;//此时默认包子不存在
}
//包子铺生产包子,包子铺需要获得包子的属性,
//包子铺需要抢占cpu资源,所以需要继承Thread
public class BaoZiPu extends Thread{
    //初始化一个bz参数,用于上锁的参数,而这个参数的类型是包子类型,这样就可以引用包子里的属性
    //这样就可以把包子和包子铺之间产生联系
    private BaoZi bz;
    //这时我们需要实现run方法
    public BaoZiPu(String name,BaoZi bz){
        super(name);
        this.bz=bz;
    }
    @Override
    public void run() {
        //默认包子的数量是0
        int count = 0;
        //b
        while (true){//通过一个循环说明包子铺是一直造包子
            //对于生产包子,需要抢占cpu资源,所以我们需要上锁
            synchronized (bz){//这里的bz相当于一个锁,
                //如果要生产包子,我们需要看看包子是不是还有
                if (bz.flag==true){//此时说明还有包子,我们不需要生产
                    //有包子我们这个包子铺线程需要等待
                    try {
                        //而这个等待是传入的这个锁的参数进行等待,这里面就是bz
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //说明没有包子,需要造包子
                //这时我们需要唤醒包子铺进程,制造包子
                bz.notify();
                System.out.println("包子铺正在造包子");
                //在这里包子分为两类
                if (count%2==0){
                    bz.pier="冰皮";
                    bz.xianer="五仁";
                }else {
                    bz.pier="薄皮";
                    bz.xianer="牛肉大葱";
                }
                //此时说明做好了
                count++;
                //做好之后我们就让包子铺中显示有包子
                bz.flag = true;
                System.out.println("包子造好了:"+bz.pier+bz.xianer);
                System.out.println("吃货来吃吧");

            }

        }
    }
}
//要标明是一个线程
public class ChiHuo extends Thread {
    //同样的,我们需要提供一个锁
    private BaoZi bz;
    public ChiHuo(String name,BaoZi bz){
        super(name);
        this.bz=bz;
    }

    @Override
    public void run() {
        while (true){//人要一直吃
            //对该方法进行上锁
            synchronized (bz){
                if (bz.flag==false){//此时说明没有包子
                    //这时我们需要让ChiHuo等待
                    try {
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //否则说明有包子
                bz.notify();
                System.out.println("吃货正在吃"+bz.pier+bz.xianer+"包子");
                //当我们吃完包子时,说明包子没有了
                bz.flag=false;

            }

        }
    }
}
/*
* 这个包子说明有三个类
* 1、包子类 2、包子铺类 3、人类(这里面我们时吃货类)
* */
public class Program {
    public static void main(String[] args) {
        //实例化三个对象
        BaoZi baoZi = new BaoZi();
        BaoZiPu bzp = new BaoZiPu("包子铺",baoZi);
        ChiHuo ch = new ChiHuo("吃货", baoZi);
        bzp.start();
        ch.start();
    }
}

线程池

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

public class Program {
    public static void main(String[] args) {
       /* ExecutorService es = Executors.newCachedThreadPool();//随任务产生线程池
       for (int i =0;i<100;i++){
           int temp = i;
           es.execute(new Runnable() {
               @Override
               public void run() {
                   System.out.println(Thread.currentThread().getName()+"  "+"i="+temp);
               }
           });
       }*/
//自定线程池里的线程的个数
        ExecutorService es = Executors.newFixedThreadPool(4);
        for (int i = 0;i<100;i++){
            int temp = i;
            es.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+"  "+"i="+ temp);
                }
            });
        }
    }
}

文件操作

import java.io.File;
import java.io.IOException;
import java.util.Date;
public class Demo5 {
    public static void main(String[] args) throws IOException {
        File file = new File("C:\\Users\\fuwei\\Desktop\\Test\\test1");
        //1、这个文件必须不存在,才能创建成功
        boolean newFile = file.createNewFile();
        File file1 = new File("C:\\Users\\fuwei\\Desktop\\Test\\aa");
        //创建新的目录
        boolean mkdir = file1.mkdir();
        //创建多级目录
        File file2 = new File("C:\\Users\\fuwei\\Desktop\\Test\\aa\\bb\\cc\\dd");
        boolean mkdir1 = file2.mkdirs();
        //2、删除文件
        boolean delete = file.delete();
        //3、判断文件或者文件夹是否存在
        boolean exists = file1.exists();
        //判断是否是文件
        File file3 = new File("C:\\Users\\fuwei\\Desktop\\Test\\test.txt");
        boolean newFile1 = file3.createNewFile();
        boolean file4 = file3.isFile();
        //判断文件是否是目录
        boolean directory = file2.isDirectory();
        //判断文件是否是隐藏文件
        boolean hidden = file3.isHidden();
        //判断文件是否可读
        boolean b = file3.canRead();
        //判断文件是否是可写
        boolean b1 = file3.canWrite();
        //重命名功能,保证参数的对象路径是一致的
        boolean b2 = file3.renameTo(new File("C:\\Users\\fuwei\\Desktop\\Test\\test1.txt"));
        //4、获取
        //获取绝对路径
        String absolutePath = file3.getAbsolutePath();
        //获取相对路径
        String path = file3.getPath();
        //获取文件名
        String name = file3.getName();
        //获取文件的大小
        long length = file3.length();
        //获取最后一次修改的时间
        long l = file3.lastModified();
        Date date = new Date(l);
        //获取父目录
        String parent = file3.getParent();
        //获取当前目录下所有信息
        String[] list = file3.list();
        //获取该目录下的文件的列表
        File[] files = file3.listFiles();
    }
}

判断某一目录下是否含有.java文件,如果有就输入文件的名称

import java.io.File;
import java.io.IOException;
public class Demo6 {
    public static void main(String[] args) throws IOException {
        File file = new File("C:\\Users\\fuwei\\Desktop\\Test");
        //先判断是否有.Java文件
        //首先获取所有的文件
        //通过数组去获取所有的文件
        File[] files = file.listFiles();
        for (File file1 : files) {
            //获取文件的名称
            String name = file1.getName();
            //判断文件的后缀名
            if (name.endsWith("java")){
                System.out.println(name);
            }
        }
    }
}

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 12:46:21  更:2021-08-18 12:47:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:24:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码