实验06 线程应用及线程并发库由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“实验06多线程”。
实验六 线程应用及线程并发库
1.实验内容
实验题1编写一程序,实现如下功能:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,主线程循环100次,如此循环50次。package cn.jp.me;
public cla ManageProcedure {
public synchronized void addMainProcedure(){
if(shouldBeSub){ try { wait();
} } for(int i = 1;i
if(!shouldBeSub){
try { wait();public ManageProcedure(int subTimes, int mainTimes){
} shouldBeSub = true;this.subTimes = subTimes;this.mainTimes = mainTimes;private boolean shouldBeSub;private int subTimes, mainTimes;} catch(InterruptedException e){
}
} catch(InterruptedException e){
} } } for(int i = 1;i
public cla SingleProcedure implements Runnable {
@Override public void run(){
if(type.equals(“sub”)){
for(int i = 0;i
} ManageProcedure manageProcedure){ private int times;private String type;private ManageProcedure manageProcedure;this.times = times;this.type = type;this.manageProcedure = manageProcedure;} else {
for(int i = 0;i
} } } package cn.jp.me;
import java.util.Scanner;
public cla Text {
} } subThread.start();mainThread.start();Thread subThread = new Thread(subProcedure);Thread mainThread = new Thread(mainProcedure);
ManageProcedure manageProcedure = new ManageProcedure(subTimes, mainTimes);public static void main(String[] args){
int subTimes, mainTimes, totalTimes;Scanner scanner = new Scanner(System.in);System.out.println(“Please Input The SubTimes && MainTimes && The Total Times”);subTimes = scanner.nextInt();mainTimes = scanner.nextInt();totalTimes = scanner.nextInt();SingleProcedure subProcedure = new SingleProcedure(totalTimes, “sub”, manageProcedure);SingleProcedure mainProcedure = new SingleProcedure(totalTimes, “main”, manageProcedure);
实验题2 设计4个线程,其中2个线程每次对count增加1,另外两个线程每次对count减1。
package cn.jp.me;
public cla SingleProcedure implements Runnable {
public synchronized void run(){
if(type.equals(“Add”)){ for(int i = 0;i
} ManageProcedure manageProcedure){ this.times = runTimes;type = typeString;this.manageProcedure = manageProcedure;private int times;private String type;private ManageProcedure manageProcedure;
}
}
} } for(int i = 0;i
} package cn.jp.me.text;
import cn.jp.me.ManageProcedure;import cn.jp.jme.SingleProcedure;
public cla Text {
Thread addOne = new Thread(singleAdd);public static void main(String[] args){
ManageProcedure manageProcedure = new ManageProcedure();SingleProcedure singleAdd = new SingleProcedure(100 / 2, “Add”, manageProcedure);100 / 2, “substract”, manageProcedure);SingleProcedure singleSubstract = new SingleProcedure(public int getCount(){ } return count;public synchronized void substract(){
}--count;System.out.println(“Thread ” + Thread.currentThread().getName()+ “The Count : ” + getCount());public synchronized void add(){
} ++count;System.out.println(“Thread ” + Thread.currentThread().getName()+ “The Count : ” + getCount());public ManageProcedure(){ } count = 0;private int count;
}
} addOne.setName(“Add One Thread”);Thread addTwo = new Thread(singleAdd);addTwo.setName(“Add Two Thread”);Thread substractOne = new Thread(singleSubstract);substractOne.setName(“Substract One Thread”);Thread substractTwo = new Thread(singleSubstract);substractTwo.setName(“Substract Two Thread”);addOne.start();addTwo.start();substractOne.start();substractTwo.start();
实验题3 CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环的 barrier。
题目要求:
(1)要在公司大厅集合、然后参观陈云故居;
(2)参观完后集合、准备去淀水湖参观(有3辆车、对应3个线程);
说明:必须等大家都到齐了才能去下个地方、比如说在公司集合、3辆车子都到了才能出发等。要求:用java线程并发库的CyclicBarrier类模拟上述参观过程。
package cn.jp.me;
import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;
public cla SingleProcedure implements Runnable {
@Override public void run(){
System.out.println(“ ” + Thread.currentThread().getName()+ “arrives DaTingn And Start Waitting”);public SingleProcedure(CyclicBarrier barrier){ } this.barrier = barrier;private CyclicBarrier barrier;try { barrier.await();} catch(InterruptedException | BrokenBarrierException e){ } System.out.println(“ ” + Thread.currentThread().getName()e.printStackTrace();
}
}
+ “arrives ChenYunGuJunAnd Start Waitting”);try { barrier.await();} catch(InterruptedException | BrokenBarrierException e){ } e.printStackTrace();package cn.jp.me.text;
import java.util.concurrent.CyclicBarrier;
import cn.jp.me.SingleProcedure;
public cla Text {
busOne.start();busTwo.start();busThree.start();
Thread busOne = new Thread(component);busOne.setName(“BusOne”);Thread busTwo = new Thread(component);busTwo.setName(“BusTwo”);Thread busThree = new Thread(component);busThree.setName(“BusThree”);
@Override public void run(){ } System.out.println(“All are arrived and Start to next place”);public static void main(String[] args){ CyclicBarrier barrier = new CyclicBarrier(3, new Runnable(){ });SingleProcedure component = new SingleProcedure(barrier);
} }
实验题4 某图书馆邀请一著名作家签名售书,大家去买书,具体情况如下:
(1)买书的读者很多必须排队,作家签好名的书不多(但是他还会看书的销售的情况,一般满了10本(假设)就不会再签了);
(2)有的书还没有签名,这样排在前面的同学就可以买到书、排在后面的就必须等有了签过名的书才能买;
(3)已经签好名的书可以放在ArrayBlockingQueue中,签好名的书不断的向这个队列里放,而买书的读者不断的从里面取书,如没有签名的书,就必须等,书有10本了,作家就停下来休息。买书的每个读者都可以看作一个线程、作家签名也可以看作是一个线程;
(4)排在前面的读者先买。要求:编写程序,模拟上述过程。
package cn.jp.me;
public cla Author implements Runnable {
public Author(CommonData data){ } this.data = data;private CommonData data;
}
package cn.jp.me;
public cla Reader implements Runnable {
@Override public void run(){
for(int i = 0;i
try { buyABook();} catch(InterruptedException e){ public Reader(CommonData data){ } this.data = data;private CommonData data;private void SignABook()throws InterruptedException {
} while(data.getNumber()== 10){
} data.setSign(data.getSign()+ 1);;System.out.println(“The Author Sign NO.” + data.getSign()+ “ book”);data.put(“The Author Sign No.” + data.getSign()+ “Book”);System.out.println(“There Are ” + data.getNumber()+ “Books Signed”);while(data.getNumber()== 10){
} System.out.println(“There Are 10 Books.The Author Chould Rest A While”);Thread.sleep(4000);System.out.println(“There Are 10 Books.The Author Chould Rest A While”);Thread.sleep(4000);} @Override public void run(){
for(int i = 0;i
} try {
} SignABook();e.printStackTrace();} catch(InterruptedException e){
}
}
} } e.printStackTrace();private void buyABook()throws InterruptedException {
} while(data.getNumber()== 0){
} data.setBuy(data.getBuy()+ 1);System.out.println(“Buy The No.” + data.getBuy()+ “ Book”);System.out.println(data.getFirBook()+ “Be Bought”);System.out.println(“There Are ” + data.getNumber()+ “Books Signed”);while(data.getNumber()== 0){
} System.out.println(“There Does Not Exist Books Signed.Must Wait……”);Thread.sleep(3000);System.out.println(“There Does Not Exist Books Signed.Must Wait……”);Thread.sleep(3000);package cn.jp.me;
import java.util.concurrent.ArrayBlockingQueue;
public cla CommonData {
public String getFirBook()throws InterruptedException { } return queue.take();public int getNumber(){ } return queue.size();public CommonData(int times){
} queue = new ArrayBlockingQueue(10);this.times = times;buy = 0;sign = 0;private ArrayBlockingQueue queue;private int buy, sign;private int times;
} public void put(String elem)throws InterruptedException { } public int getTimes(){ } public int getBuy(){ } public void setBuy(int buy){ } public int getSign(){ } public void setSign(int sign){ } this.sign = sign;return sign;this.buy = buy;return buy;return times;queue.put(elem);package cn.jp.me;
public cla Text {
} public static void main(String[] args){
} CommonData data = new CommonData(100);Author author = new Author(data);Reader reader = new Reader(data);new Thread(author).start();new Thread(reader).start();
实验题5模拟拥有一定数量账户的银行,把随机产生的钱在不同账号之间进行转移交易。每个账号都有一个线程,在每笔交易中,都会从线程所服务的账户中随机取出一定数额的钱转移到另一个随机账户中。
提示: 设计一个Bank类,它有一个transfer方法,该方法将一定数额的钱从一个账户转移到另一个账户,如源账户没有足够余额,该方法直接返回。
package cn.jp.me;
import java.text.Normalizer.Form;
public cla Bank {
}
package cn.jp.me;public int getTotalAccountNum(){ } return totalAccountNum;public void setBalance(int accountNo, int num){ } balance[accountNo] = num;public synchronized void transfer(int from, int to, int amount){
} System.out.println(“The Change From ” + from + “ To ” + to);if(balance[from] >= amount){
} System.out.println();System.out.println(“Before Transfer The Balance Of ” + from + “ : ” + balance[from] + “;Of ” + to + “ : ” + balance[to]);System.out.println(“The Change Amount : ” + amount);balance[from]-= amount;balance[to] += amount;System.out.println(“After Transfer The Balance Of ” + from + “ : ” + balance[from] + “;Of ” + to + “ : ” + balance[to]);public Bank(int accountNum){
} totalAccountNum = accountNum;balance = new int[accountNum + 1];private int totalAccountNum;private int[] balance;} else { System.out.println(“The Account ” + from + “'s Balance Is Not Enough”);
import java.util.Random;
import javax.security.auth.login.AccountException;
public cla Account implements Runnable {
} package cn.jp.me;
import java.util.Random;import java.util.Scanner;
public cla Text {
} Bank bank = new Bank(accountNum);for(int i = 1;i
} new Thread(new Account(i, random.nextInt(1000000)+ 0, bank)).start();
System.out.println(“Please Input The Number Of Account You Want To Imitate :”);accountNum = scanner.nextInt();public static void main(String[] args){
Random random = new Random();int accountNum;Scanner scanner = new Scanner(System.in);} bank.transfer(accountNo, to, changeNum);@Override public synchronized void run(){ to = random.nextInt(bank.getTotalAccountNum()+ 1);changeNum = random.nextInt(1000000)+ 0;public Account(int accountNo, int initialValue, Bank bank){
} this.accountNo = accountNo;this.bank = bank;bank.setBalance(accountNo, initialValue);private int accountNo;private Bank bank;private static Random random = new Random();int to, changeNum;}