Java多线程编程题

1. 分别设计一个Account类,和两个任务类 Company和Bank: (1)Account类拥有账户余额属性和余额增减操作;(2)Company任务类能增加Account对象中的余额;(3)Bank任务类能减少(或使用)Account对象中的余额(比如用于基金投资)。要求使用同一account对象来分别创建两个Company线程对象和两个Bank线程对象,通过两次测试来完成以下两任务(实验报告中 截两个图对应以下两个任务):

 1) 出现Account对象余额不一致问题(同步问题);

 2)使用同步代码块或同步方法或Lock对象来解决同步问题。

package com.join;

class Bank implements Runnable {

    private Account account;

    Bank(Account account) {
        this.account = account;
    }

    @Override
    public void run() {
        for (int i = 0; i != 5; ++i) {
            account.decreaseBalance(10);
        }
    }
}

class Company implements Runnable {

    private Account account;

    Company(Account account) {
        this.account = account;
    }

    @Override
    public void run() {
        for (int i = 0; i != 5; ++i) {
            account.increaseBalance(10);
        }
    }
}

public class Account {

    private double balance;

    private Account(double balance) {
        this.balance = balance;
    }

    void increaseBalance(double increment) {
        double b = balance;
        b = balance + increment;
        balance = b;
    }

    void decreaseBalance(double decrement) {
        double b = balance;
        b = balance - decrement;
        balance = b;
    }

    private synchronized double getBalance() {
        return balance;
    }

    public static void main(String[] args) {
        Account account = new Account(100);
        Company company = new Company(account);
        Bank bank = new Bank(account);
        Thread t1 = new Thread(company);
        Thread t2 = new Thread(company);
        Thread t3 = new Thread(bank);
        Thread t4 = new Thread(bank);
        // 或者给方法加锁
        try {
            t1.start();
            t1.join();
            t2.start();
            t2.join();
            t3.start();
            t3.join();
            t4.start();
            t4.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("最终余额为:" + account.getBalance());
    }
}

2. 设计一个生产电脑和搬运电脑类,要求生产一台电脑就搬走一台电脑,如果没有新的电脑生产出来,则搬运工要等待新电脑产出;如果生产出的电脑没有搬走,则要等待电脑搬走之后在生产,并统计出生产的电脑数量。

package com.my.test;

class Producer extends Thread {

    int count = 0;
    boolean hasNewComputer = false;

    public Producer(String name) {
        super(name);
    }

    private synchronized void produceComputer() throws InterruptedException {
        while (hasNewComputer) {
            wait();
        }
        Thread.sleep(3000);
        hasNewComputer = true;
        System.out.println(Thread.currentThread().getName() + ":生产第" + ++count + "台电脑");
        notify();
    }

    public synchronized void consumeComputer(int count) throws InterruptedException {
        while (!hasNewComputer) {
            wait();
        }
        Thread.sleep(3000);
        hasNewComputer = false;
        System.out.println(Thread.currentThread().getName() + ":第" + count + "台电脑被消费");
        notify();
    }


    @Override
    public void run() {
        while (true) {
            try {
                produceComputer();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Consumer extends Thread {

    int count = 0;
    Producer producer;

    public Consumer(String name, Producer producer) {
        super(name);
        this.producer = producer;
    }

    @Override
    public void run() {
        while (true) {
            try {
                producer.consumeComputer(++count);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Producer producer = new Producer("producer");
        Consumer consumer = new Consumer("consumer", producer);
        producer.start();
        consumer.start();
    }
}
原文地址:https://www.cnblogs.com/xkxf/p/10080051.html