【Java作业】Week10——多线程

作业一

package org.westos.test.test01;

/**
 * 编写一个应用程序,在线程同步的情况下来实现“生产者―消费者”问题。
 */
public class TestDemo01 {
    public static void main(String[] args) {
        Student01 s = new Student01();
        Thread th01 = new Thread(new SetTest01(s));//生产者线程
        Thread th02 = new Thread(new GetTest01(s));//消费者线程
        th01.start();
        th02.start();
    }
}

package org.westos.test.test01;

/**
 * 练习1自定义类
 */
public class Student01 {
    public String name;
    public int age;
    public boolean flag = false;
    public Student01() {
    }

    public Student01(String name, int age) {

        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

package org.westos.test.test01;

/**
 * 练习1 生产者
 * 制造学生数据
 */
public class SetTest01 implements Runnable {

    public static int x = 0;
    private Student01 s;

    public SetTest01(Student01 s) {
        this.s = s;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (s) {//同步方法
                //若没有数据,就输入数据,如果有数据,就等待进入消费者线程
                if (s.flag) {
                    try {
                        s.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if (x % 2 == 0) {
                    s.setName("张三");
                    s.setAge(23);
                } else {
                    s.setName("李四");
                    s.setAge(24);
                }
                x++;

                //输入完信息之后,唤醒等待的线程,改变标记
                s.flag = true;
                s.notify();
            }
        }
    }
}


package org.westos.test.test01;

/**
 * 练习1消费者
 * 输出学生数据
 */
public class GetTest01 implements Runnable{
    private Student01 s;

    public GetTest01(Student01 s) {
        this.s = s;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (s) {
                if (!s.flag) {//如果没有数据,消费者线程就进入等待
                    try {
                        s.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(s.getName() + "-----" + s.getAge());
                s.flag = false;
                s.notify();
            }
            }
        }
    }



作业二

package org.westos.test.Test02;

import java.io.*;


/**
 * 将若干个Student对象;若干个Teacher对象,写出到d:/0404/a.txt中
 * 思路:通过序列化与反序列化将对象输出到txt中
 * 应该吧对象写入集合中
 */
public class TestDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //先建立若干个Teacher对象,和若干个Student对象
        Student stu1 = new Student("张三", 13, "001");
        Student stu2 = new Student("李四", 14, "002");
        Student stu3 = new Student("王五", 15, "003");

        Teacher t1 = new Teacher("赵六", 26, "01");
        Teacher t2 = new Teacher("钱七", 27, "02");


        new File("d:\\0404").mkdir();
        File file = new File("d:\\0404\\a.txt");
        file.createNewFile();
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
        oos.writeObject(stu1);
        oos.writeObject(stu2);
        oos.writeObject(stu3);
        oos.writeObject(t1);
        oos.writeObject(t2);
        oos.close();
    }
}

作业三

        File file = new File("d:\\0404\\a.txt");
        //使用ObjectInputStream来阅读
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        List<Student> listS = new ArrayList<Student>();
        List<Teacher> listT = new ArrayList<Teacher>();
        Object obj = null;
        while ((obj = ois.readObject()) != null) {
            if (obj instanceof Student) {
                listS.add((Student) obj);
            } else {
                listT.add((Teacher) obj);
            }
        }
        ois.close();


作业四

package org.westos.test.test04;

import java.util.Arrays;

/**
 * 实现字符串和字节数组之间的相互转换,比如:将字符串”西部开源技术中心xbkyjszx”转换为字节数组,并将字节数组再转换回字符串!
 */
public class TestDemo {

    public static byte[] stringToByteArray(String s) {
        return s.getBytes();
    }

    public static String byteArrayToString(byte bys[]) {
        return new String(bys);
    }

    public static void main(String[] args) {
        String s = "西部开源技术中心xbkyjszx";
        byte[] bys = stringToByteArray(s);
        System.out.print("stringToByteArray: ");
        for (byte b : bys) {
            System.out.print(b + " ");
        }
        System.out.println();
        String s1 = byteArrayToString(bys);
        System.out.println("byteArrayToString: " + s1);

    }
}


作业五

package org.westos.test.test05;

import java.io.File;

/**
 * 递归实现输入任意目录,列出文件以及文件夹
 */
public class TestDemo {
        private static File file = new File("src");
        /**
         * 思路:
         *  通过listFiles方法求出所有子文件
         *  遍历file数组
         *  输出制表符来表示层级关系
         *  输出遍历得到的file对象名称
         *  如果是目录则递归调用
         *  如果是文件则没有任何操作
         * @param file 表示要输出的目录
         * @param count 表示输出的制表符数量
         */
    public static void printFile(File file,int count) {
        File[] files = file.listFiles();
        if (file.isDirectory()) {
            for(File f : files) { //增强for循环遍历file数组
                //输出制表符,来形象的表示文件之间的层级关系
                for (int i = 0; i < count; i++) {
                    System.out.print("\t");
                }
                count ++;
                System.out.println(f.getName());//由于文件和目录都要输出名称,所以将其抽取出来
                if(f.isDirectory()) {
                    printFile(f, count);
                }//如果表示得是文件,则不作任何操作
            }
        }
    }

    public static void main(String[] args) {
        System.out.println(file.getName());
        printFile(file,1);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值