1.个人账户里存有1000千块,一个人用卡取500,另一个人用存折取800,也就是同时有两个线程对同一个实例操作,请正确输出操作后的结果。
2.有一个Map<Long, Set<String>>容器,要求设计一个同步操作:一个线程每隔1秒往Map中put一个键值对,另一个线程每隔2秒从中移除一个键值对,还有一个线程每隔3秒迭代打印所有的键值对内容以及Set中的内容。
3.某自动售票机有几个买票的操作平台,机里有20张票,一张卖5元,现在里面没现金,只有票,售票机只能放入10元跟5元。张三用10元来买一张票,售票机找不出零钱,需要等待,此时李四用五元来买一张票,售票机就可以找钱了。
2.有一个Map<Long, Set<String>>容器,要求设计一个同步操作:一个线程每隔1秒往Map中put一个键值对,另一个线程每隔2秒从中移除一个键值对,还有一个线程每隔3秒迭代打印所有的键值对内容以及Set中的内容。
3.某自动售票机有几个买票的操作平台,机里有20张票,一张卖5元,现在里面没现金,只有票,售票机只能放入10元跟5元。张三用10元来买一张票,售票机找不出零钱,需要等待,此时李四用五元来买一张票,售票机就可以找钱了。
后面的都涉及线程同步问题,原理基本一样,就不细说了。
账户:package com.briup.ch10;public class Account {
private long no;
private double balance;
synchronized public String deposit(double amount){
String msg=""; if(amount<0){
msg="sorry,amount not right.";
}else{
balance=balance+amount;
msg=Thread.currentThread().getName()+" earn"+amount+" and balance has"+balance;
notifyAll();
}
return msg;
}
synchronized public String withdraw(double amount){
String msg=""; while(amount<0||amount>balance){
msg="sorry,amount not right.";
try{
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
balance=balance-amount;
msg=Thread.currentThread().getName()+" withdraw"+amount+" and balance has"+balance;
return msg;
}
}存钱的
package com.briup.ch10;public class Boys extends Thread{
private Account account;
public Boys(Account account,String name){
this.account=account;
setName(name);
start();
}
public void run(){
while(true){
long amount=(long)(Math.random()*10000);
String msg=account.deposit(amount);
System.out.println(msg);
try{
sleep(amount);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}取钱的
package com.briup.ch10;public class Girls implements Runnable{
private Account account;
public Girls(Account account,String name){
Thread t=new Thread(this);
this.account=account;
t.setName(name);
t.start();
}
public void run(){
while(true){
long amount=(long)(Math.random()*10000);
String msg=account.withdraw(amount);
System.out.println(msg);
try{
Thread.currentThread().sleep(amount);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}测试package com.briup.ch10;public class ATM{
public static void main(String[] args) {
Account account=new Account();
Thread t1=new Boys(account,"tony");
new Girls(account,"lucy");
new Girls(account,"track");
}
}
实现了一个程序
insertThread每秒在尾部插入一个数据
deleteThread每2秒删除第一个
printThread每三秒打印一次
插入的数据是
id: 2个数字
数据中字符串楼主可以自己改~~*_*
希望对楼主有帮助~import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
//有一个Map<Long, Set<String>>容器,要求设计一个同步操作:
//一个线程每隔1秒往Map中put一个键值对,
//另一个线程每隔2秒从中移除一个键值对,
//还有一个线程每隔3秒迭代打印所有的键值对内容以及Set中的内容。
public class SynchronousMap {
Map<Long,Set<String>> map;
public SynchronousMap(){
this.map = new HashMap<Long,Set<String>>();
}
public Map<Long,Set<String>> getMap(){
return map;
}
public static void main(String[] args){
SynchronousMap map = new SynchronousMap();
insertThread thread1 = new insertThread(map);
deleteThread thread2 = new deleteThread(map);
printThread thread3 = new printThread(map);
thread1.start();
thread2.start();
thread3.start();
}
}class insertThread extends Thread {
Map<Long,Set<String>> myMap;
insertThread(SynchronousMap MyMap){
myMap = MyMap.getMap();
}
public void run() {
while (true) {
synchronized (myMap) {
long num;
if(myMap.size() == 0)
num = 0;
else
num = (Long) myMap.keySet().toArray()[myMap.keySet().size()-1];
System.out.print("insert\n\n");
Set<String> strlst = new HashSet<String>();
strlst.add(num + 1 + "");
strlst.add(num + 2 + "");
myMap.put(num + 1, strlst);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}class deleteThread extends Thread {
Map<Long,Set<String>> myMap;
deleteThread(SynchronousMap MyMap){
myMap = MyMap.getMap();
}
public void run() {
while (true) {
synchronized (myMap) {
System.out.print("delete\n\n");
if (myMap.size() >= 1){
Set<String> s = myMap.remove(myMap.keySet().toArray()[0]);
if(s == null)
System.out.println("ssss");
}
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}class printThread extends Thread {
Map<Long,Set<String>> myMap;
printThread(SynchronousMap MyMap){
myMap = MyMap.getMap();
}
public void run() {
while (true) {
synchronized (myMap) {
System.out.print("print:\n");
Object[] keys = (Object[]) myMap.keySet().toArray();
for (long i = 0; i < keys.length; i++) {
Object[] strs = myMap.get(keys[(int) i]).toArray();
System.out.print(keys[(int) i] + ":");
for (int j = 0; j < strs.length; j++) {
System.out.print(strs[j].toString() + " ");
}
System.out.print("\n");
}
System.out.print("\n");
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
非常感谢,学习了。
但如下这然话 编译不了:
Object[] strs = myMap.get(keys[(int) i]).toArray();还有一题可以做下吗