美文网首页
学习java多线程

学习java多线程

作者: 小猪Harry | 来源:发表于2018-06-11 13:46 被阅读0次

    先看一个例子:生产者和消费者问题。

    仓库初始化程序

    public class Buffer {
        List<Date> storage; //仓库,存储的产品为Date类
        int maxSize;
        Lock lock;
        Condition full;//仓库满
        Condition empty;//仓库空
    
        //初始化buffer
        public Buffer(int maxSize) {
            this.maxSize = maxSize;
            this.storage = new ArrayList<>();
            this.lock = new ReentrantLock();
            this.full = lock.newCondition();
            this.empty = lock.newCondition();
        }
    
        //生产产品
        public void put(){
            lock.lock();
    
            if (storage.size() >= maxSize)
            {
                try {
                    full.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            else
            {
                Date dateGoods = new Date();
                storage.add(dateGoods);
                System.out.println(Thread.currentThread().getName() + "本次生产产品为:" + dateGoods);
                System.out.println("当前库存为:" + storage.size());
                empty.signalAll();//唤醒消费
            }
    
            lock.unlock();
        }
        
        //消费产品
        public void take(){
            lock.lock();
    
            if (storage.size() == 0)
            {
                try {
                    empty.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            else
            {
                Date dateGoods = new Date();
                dateGoods = storage.get(storage.size()-1);
                storage.remove(dateGoods);
                System.out.println(Thread.currentThread().getName() + "本次消费产品为:" + dateGoods);
                System.out.println("当前库存为:" + storage.size());
                full.signalAll();//唤醒生产
            }
    
            lock.unlock();
        }
    }
    

    生产者程序

    public class Producer implements Runnable {
    
        Buffer buffer;
    
        //导入buffer,类似于继承其全部性质
        public Producer(Buffer buffer) {
            this.buffer = buffer;
        }
    
        @Override
        public void run() {
            while (true){
                buffer.put();
                //生产后休息一会儿,让出CPU时间片
                try {
                    Thread.sleep((long)(Math.random()*10));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    消费者程序

    public class Consumer implements Runnable {
        Buffer buffer;
    
        //导入buffer,类似于继承其全部性质
        public Consumer(Buffer buffer) {
            this.buffer = buffer;
        }
    
        @Override
        public void run() {
            while (true){
                buffer.take();
                //消费后休息一会儿,让出CPU时间片
                try {
                    Thread.sleep((long)(Math.random()*20));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    主程序

    public class Main {
    
        public static void main(String[] args) {
            Buffer buffer = new Buffer(20);
            Producer producer = new Producer(buffer);
            Consumer consumer1 = new Consumer(buffer);
            Consumer consumer2 = new Consumer(buffer);
    
            new Thread(producer,"苹果公司").start();
            new Thread(consumer1,"钢铁侠").start();
            new Thread(consumer2,"奇异博士").start();
        }
    }
    运行结果:
    苹果公司本次生产产品为:Mon Jun 11 13:34:15 CST 2018
    当前库存为:1
    钢铁侠本次消费产品为:Mon Jun 11 13:34:15 CST 2018
    当前库存为:0
    苹果公司本次生产产品为:Mon Jun 11 13:34:15 CST 2018
    当前库存为:1
    钢铁侠本次消费产品为:Mon Jun 11 13:34:15 CST 2018
    当前库存为:0
    苹果公司本次生产产品为:Mon Jun 11 13:34:15 CST 2018
    当前库存为:1
    钢铁侠本次消费产品为:Mon Jun 11 13:34:15 CST 2018
    当前库存为:0
    苹果公司本次生产产品为:Mon Jun 11 13:34:15 CST 2018
    当前库存为:1
    苹果公司本次生产产品为:Mon Jun 11 13:34:15 CST 2018
    当前库存为:2
    苹果公司本次生产产品为:Mon Jun 11 13:34:15 CST 2018
    当前库存为:3
    钢铁侠本次消费产品为:Mon Jun 11 13:34:15 CST 2018
    当前库存为:2
    ……
    苹果公司本次生产产品为:Mon Jun 11 13:34:17 CST 2018
    当前库存为:16
    钢铁侠本次消费产品为:Mon Jun 11 13:34:17 CST 2018
    当前库存为:15
    苹果公司本次生产产品为:Mon Jun 11 13:34:17 CST 2018
    当前库存为:16
    苹果公司本次生产产品为:Mon Jun 11 13:34:17 CST 2018
    当前库存为:17
    奇异博士本次消费产品为:Mon Jun 11 13:34:17 CST 2018
    当前库存为:16
    苹果公司本次生产产品为:Mon Jun 11 13:34:17 CST 2018
    当前库存为:17
    苹果公司本次生产产品为:Mon Jun 11 13:34:17 CST 2018
    当前库存为:18
    苹果公司本次生产产品为:Mon Jun 11 13:34:17 CST 2018
    当前库存为:19
    苹果公司本次生产产品为:Mon Jun 11 13:34:17 CST 2018
    当前库存为:20
    奇异博士本次消费产品为:Mon Jun 11 13:34:17 CST 2018
    当前库存为:19
    钢铁侠本次消费产品为:Mon Jun 11 13:34:17 CST 2018
    当前库存为:18
    奇异博士本次消费产品为:Mon Jun 11 13:34:17 CST 2018
    当前库存为:17
    苹果公司本次生产产品为:Mon Jun 11 13:34:17 CST 2018
    ……
    
    

    再看一个例子:阻塞队列练习,开启一个线程读取目录结构,把文件添加到阻塞队列中,另外数个线程从队列中读取文件,并把文件中包含已设定关键字的行打印出来。

    读文件程序:

    public class FilePicker implements Runnable {
        String path;
        BlockingQueue<File> fileBlockingQueue;
    
        public FilePicker(String path, BlockingQueue<File> fileBlockingQueue) {
            this.path = path;
            this.fileBlockingQueue = fileBlockingQueue;
        }
    
        @Override
        public void run() {
            File file = new File(path);
    
            if (!file.exists())
            {
                System.out.println("Error!");
                return;
            }
            else
            {
                try {
                    ListFiles(file);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            try {
                fileBlockingQueue.put(TestBlockingQueue.END_FLAG);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("FilePicker is done!");
        }
    
        public void ListFiles(File filePath) throws InterruptedException {
            Thread.sleep(100);
            File[] files = filePath.listFiles();
    
            for (File file1 : files)
            {
                if (file1.isDirectory())
                {
                    ListFiles(file1);
                }
                else
                {
                    fileBlockingQueue.put(file1);
                }
            }
        }
    }
    

    写文件程序:

    public class FileAnalyzer implements Runnable {
        String word;
        BlockingQueue<File> fileBlockingQueue;
    
        public FileAnalyzer(String word, BlockingQueue<File> fileBlockingQueue) {
            this.word = word;
            this.fileBlockingQueue = fileBlockingQueue;
        }
    
        @Override
        public void run() {
            File file1 = null;
            while (file1 != TestBlockingQueue.END_FLAG)
            {
                try {
                    file1 = fileBlockingQueue.take();
                    if (file1 != TestBlockingQueue.END_FLAG)
                    {
                        FileInputStream fileInputStream = null;
                        try {
                            fileInputStream = new FileInputStream(file1);
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }
                        Scanner scanner = new Scanner(fileInputStream);
    
                        int line = 1;
                        while (scanner.hasNext())
                        {
                            String string = scanner.nextLine();
                            if (string.contains(word))
                            {
                                System.out.println("在文件" + file1 + "中的第" + line + "行找到了" + string);
                            }
                            line++;
                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            try {
                fileBlockingQueue.put(TestBlockingQueue.END_FLAG);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("FileAnalyzer is done!");
    
        }
    }
    

    主程序:

    public class TestBlockingQueue {
    
        public static final File END_FLAG = new File("");
        public static final String KEY_WORD = "public";
        public static final String PATH = "D:\\Users\\Think\\IdeaProjects\\JavaBase\\src\\com";
        public static final int Q_SIZE = 20;
    
        public static void main(String[] args) {
            BlockingQueue<File> q = new LinkedBlockingQueue<>(Q_SIZE);
    
            FilePicker filePicker = new FilePicker(PATH,q);
            new Thread(filePicker).start();
    
    //        FileAnalyzer fileAnalyzer = new FileAnalyzer(KEY_WORD,q);
    //        new Thread(fileAnalyzer).start();
            for(int i=0; i< 3; i++)
            {
                FileAnalyzer analyzer = new FileAnalyzer(KEY_WORD,q);
                new Thread(analyzer).start();
            }
        }
    }
    运行结果:
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\HourlyEmployee.java中的第6行找到了public class HourlyEmployee extends ColaEmployee{
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\ColaEmployee.java中的第6行找到了public abstract class ColaEmployee{
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\SalariedEmployee.java中的第6行找到了public class SalariedEmployee extends ColaEmployee{
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\ColaEmployee.java中的第10行找到了public ColaEmployee()
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\HourlyEmployee.java中的第10行找到了    public HourlyEmployee(){}
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\SalariedEmployee.java中的第10行找到了    public SalariedEmployee(){
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\ColaEmployee.java中的第14行找到了public ColaEmployee(String name, int month)
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\HourlyEmployee.java中的第12行找到了    public HourlyEmployee(String name, int month, int hourSalary, int hour)
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\SalariedEmployee.java中的第13行找到了    public SalariedEmployee(String name, int month, double salary)
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\ColaEmployee.java中的第20行找到了public abstract double getSalary(int month);
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\SalariedEmployee.java中的第19行找到了    public double getSalary(int month)
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\HourlyEmployee.java中的第20行找到了    public double getSalary(int month)
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\TestCompany.java中的第6行找到了public class TestCompany{
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\SalesEmployee.java中的第6行找到了public class SalesEmployee extends ColaEmployee{
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\TestCompany.java中的第7行找到了    public static void main(String[] args){
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\SalesEmployee.java中的第11行找到了    public SalesEmployee(){}
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\SalesEmployee.java中的第13行找到了    public SalesEmployee(String name, int month, int monthsales, float rate)
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\TestCompany.java中的第21行找到了    public static void payWage(ColaEmployee emp, int month){
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\SalesEmployee.java中的第20行找到了    public double getSalary(int month)
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\TestBlockingQueue.java中的第10行找到了public class TestBlockingQueue {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\FilePicker.java中的第10行找到了public class FilePicker implements Runnable {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\FileAnalyzer.java中的第12行找到了public class FileAnalyzer implements Runnable {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\TestBlockingQueue.java中的第12行找到了    public static final File END_FLAG = new File("");
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\FilePicker.java中的第14行找到了    public FilePicker(String path, BlockingQueue<File> fileBlockingQueue) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\TestBlockingQueue.java中的第13行找到了    public static final String KEY_WORD = "public";
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\FileAnalyzer.java中的第16行找到了    public FileAnalyzer(String word, BlockingQueue<File> fileBlockingQueue) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\TestBlockingQueue.java中的第14行找到了    public static final String PATH = "D:\\Users\\Think\\IdeaProjects\\JavaBase\\src\\com";
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\FilePicker.java中的第20行找到了    public void run() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\TestBlockingQueue.java中的第15行找到了    public static final int Q_SIZE = 20;
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\FileAnalyzer.java中的第22行找到了    public void run() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\TestBlockingQueue.java中的第17行找到了    public static void main(String[] args) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\company\thread\FilePicker.java中的第44行找到了    public void ListFiles(File filePath) throws InterruptedException {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\ArrayDemo.java中的第8行找到了public class ArrayDemo {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\ArrayDemo.java中的第9行找到了    public static void main(String[] args) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\CollectionsDemo.java中的第10行找到了public class CollectionsDemo {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Compare1.java中的第11行找到了public class Compare1{
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Compare1.java中的第12行找到了    public static void main(String[] args) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\CollectionsDemo.java中的第11行找到了    public static void main(String[] args) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Compare1.java中的第16行找到了    public static void f(){
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Dog.java中的第6行找到了public class Dog{
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Dog.java中的第10行找到了    public Dog(int age, String dogName) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\DateDemo.java中的第10行找到了public class DateDemo {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\DateDemo.java中的第11行找到了    public static void main(String[] args) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\EqualsDemo.java中的第9行找到了public class EqualsDemo {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Dog.java中的第16行找到了    public boolean equals(Object o) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\EqualsDemo.java中的第10行找到了    public static void main(String[] args) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Dog.java中的第27行找到了    public int hashCode() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Student.java中的第6行找到了public class Student implements Comparable{
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Student.java中的第10行找到了    public Student(String name, int ranking) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Student.java中的第15行找到了    public String getName() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Student.java中的第19行找到了    public void setName(String name) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Student.java中的第23行找到了    public int getRanking() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Student.java中的第27行找到了    public void setRanking(int ranking) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Student.java中的第32行找到了    public String toString() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\filedemo\Student.java中的第40行找到了    public int compareTo(Object o) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Account.java中的第6行找到了public class Account {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Dog.java中的第6行找到了public class Dog {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\DogListTest.java中的第10行找到了public class DogListTest {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\DogListTest.java中的第11行找到了    public static void main(String[] args) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Account.java中的第16行找到了    public Account(double balance, String password) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Dog.java中的第10行找到了    public String getName() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Account.java中的第24行找到了    public long getId() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Account.java中的第28行找到了    public void setId(long id) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Dog.java中的第14行找到了    public void setName(String name) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Account.java中的第32行找到了    public double getBalance() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Dog.java中的第18行找到了    public int getAge() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Dog.java中的第22行找到了    public void setAge(int age) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Account.java中的第36行找到了    public void setBalance(double balance) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Account.java中的第40行找到了    public String getPassword() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Account.java中的第44行找到了    public void setPassword(String password) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Account.java中的第49行找到了    public String toString() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Student.java中的第6行找到了public class Student {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\GuessWord.java中的第9行找到了public class GuessWord {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Student.java中的第15行找到了    public Student(String name,int age, int score, String className)
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\GuessWord.java中的第10行找到了    public static void main(String[] args) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Student.java中的第23行找到了    public String getName() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Student.java中的第27行找到了    public void setName(String name) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Student.java中的第31行找到了    public int getAge() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Student.java中的第35行找到了    public void setAge(int age) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Student.java中的第39行找到了    public int getScore() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Student.java中的第43行找到了    public void setScore(int score) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Student.java中的第47行找到了    public String getClassName() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\Student.java中的第51行找到了    public void setClassName(String className) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\StudentList.java中的第11行找到了public class StudentList {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\StudentList.java中的第12行找到了    public static void main(String[] args) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\TestAccount.java中的第11行找到了public class TestAccount {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\TestAccount.java中的第12行找到了    public static void main(String[] args) {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\WorldCupDemo.java中的第8行找到了public class WorldCupDemo {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\list\WorldCupDemo.java中的第9行找到了    public static void main(String[] args) {
    FilePicker is done!
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Circle.java中的第6行找到了public class Circle extends Shape{
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Shape.java中的第6行找到了public abstract class Shape{
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Circle.java中的第10行找到了    public Circle(){}
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Shape.java中的第11行找到了    public Shape(){}
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Rectangle.java中的第6行找到了public class Rectangle extends Shape{
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Shape.java中的第13行找到了    public Shape(String color)
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Circle.java中的第12行找到了    public Circle(double radius, String color)
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Shape.java中的第17行找到了    public abstract double getArea();
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Rectangle.java中的第10行找到了    public Rectangle(){}
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Circle.java中的第22行找到了    public double getArea() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Shape.java中的第18行找到了    public abstract double getPer();
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Circle.java中的第28行找到了    public double getPer() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Rectangle.java中的第12行找到了    public Rectangle(double height,double width,String color)
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Circle.java中的第34行找到了    public void showAll() {
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Rectangle.java中的第19行找到了    public double getArea(){
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Shape.java中的第19行找到了    public abstract void showAll();
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Rectangle.java中的第24行找到了    public double getPer(){
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Rectangle.java中的第29行找到了    public void showAll(){
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Test.java中的第6行找到了public class Test{
    在文件D:\Users\Think\IdeaProjects\JavaBase\src\com\shape\Test.java中的第8行找到了    public static void main(String[] args){
    FileAnalyzer is done!
    FileAnalyzer is done!
    FileAnalyzer is done!
    

    相关文章

      网友评论

          本文标题:学习java多线程

          本文链接:https://www.haomeiwen.com/subject/paxheftx.html