面试题:两人共读一本书

张三	第1天,看0页,还剩100页
张三	第2天,看9页,还剩91页
张三	第3天,看15页,还剩76页
张三	第4天,看19页,还剩57页
张三	第5天,看4页,还剩53页
张三	第6天,看1页,还剩52页
张三	第7天,看13页,还剩39页
张三	第8天,看11页,还剩28页
张三	第9天,看2页,还剩26页
张三	第10天,看16页,还剩10页
张三	第11天,看10页,还剩0页
李四	第1天,看5页,还剩95页
李四	第2天,看6页,还剩89页
李四	第3天,看14页,还剩75页
李四	第4天,看2页,还剩73页
李四	第5天,看18页,还剩55页
李四	第6天,看6页,还剩49页
李四	第7天,看5页,还剩44页
李四	第8天,看8页,还剩36页
李四	第9天,看1页,还剩35页
李四	第10天,看3页,还剩32页
李四	第11天,看8页,还剩24页
李四	第12天,看5页,还剩19页
李四	第13天,看5页,还剩14页
李四	第14天,看4页,还剩10页
李四	第15天,看10页,还剩0页

1、两人分别读-使用单线程

package com.demo.thread;

import java.util.Random;

public class Ttest02 {

	public static void main(String[] args) {
		int bookPage = 100;

		read("张三", bookPage);

		read("李四", bookPage);

	}

	public static void read(String name, int bookPage) {
		if (bookPage < 1)
			return;
		int readDays = 1;
		while (bookPage > 0) {
			int k = (int) (new Random().nextDouble() * 20);
			if (bookPage - k < 0) {
				k = bookPage;
			}
			bookPage = bookPage - k;
			System.out.println(name + "\t" + "第"
					+ (readDays++) + "天," + "看" + k + "页,还剩" + bookPage + "页");
		}
	}

}

2、两人分别读-使用多线程

package com.demo.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Ttest01 {

	public static void main(String[] args) {
		int bookPage = 100;

		Reader r1 = new Reader("张三", bookPage);
		Reader r2 = new Reader("李四", bookPage);
		r1.start();
		r2.start();

		while (true) {
			if (r1.isAlive() == false && r2.isAlive() == false) {
				print(r1, r2);
				break;
			}
		}

	}

	public static void print(Reader... readers) {
		for (Reader r : readers) {
			for (String s : r.getReadRecords()) {
				System.out.println(s);
			}
		}
	}

}

class Reader extends Thread {

	private int bookPage = 0;

	private int readDays = 1;

	private List<String> readRecords = new ArrayList<String>();

	public Reader(String name, int bookPage) {
		this.setName(name);
		this.bookPage = bookPage;
	}

	@Override
	public void run() {

		if (bookPage < 1)
			return;

		while (bookPage > 0) {
			int k = (int) (new Random().nextDouble() * 20);
			if (bookPage - k < 0) {
				k = bookPage;
			}
			bookPage = bookPage - k;
			readRecords.add(Thread.currentThread().getName() + "\t" + "第"
					+ (readDays++) + "天," + "看" + k + "页,还剩" + bookPage + "页");
		}

	}

	public List<String> getReadRecords() {
		return readRecords;
	}

}

 

 

第1天	张三	看10页,还剩90页
第2天	李四	看16页,还剩74页
第3天	张三	看17页,还剩57页
第4天	李四	看17页,还剩40页
第5天	张三	看10页,还剩30页
第6天	李四	看19页,还剩11页
第7天	李四	看7页,还剩4页
第8天	李四	看4页,还剩0页

3、两人共读-使用单线程

package com.demo.thread;

import java.util.Random;

public class Ttest03 {
	private static int bookPage = 100;

	public static void main(String[] args) {
		String[] users = new String[] { "张三", "李四" };
		int readDays = 1;
		while (bookPage > 0) {
			int n = (int) (new Random().nextDouble() * 2);
			String name = users[n];
			int k = (int) (new Random().nextDouble() * 20);
			if (bookPage - k < 0) {
				k = bookPage;
			}
			bookPage = bookPage - k;
			System.out.println("第" + (readDays++) + "天\t"+name + "\t" + "看"
					+ k + "页,还剩" + bookPage + "页");
		}
	}
}

4、两人共读-多线程

package com.demo.thread;

import java.util.Random;
、、、不正确的,需要修改变量的共享方式
public class Ttest04 {
	private static volatile int bookPage = 100;

	private static volatile int readDays = 1;
	
	public static void main(String[] args) {
		User u1 = new User("张三");
		User u2 = new User("李四");
		u1.start();
		u2.start();
	}
	
	public synchronized void read(String name){
		while (bookPage > 0) {
			int k = (int) (new Random().nextDouble() * 20);
			if (bookPage - k < 0) {
				k = bookPage;
			}
			bookPage = bookPage - k;
			
			System.out.println(name + "\t" + "第"
					+ (readDays++) + "天," + "看" + k + "页,还剩" + bookPage + "页");
		}
	}

}

class User extends Thread{
	public User(String name) {
		this.setName(name);
	}

	@Override
	public void run() {
		new Ttest04().read(this.getName());
	}
	
}

 

转载于:https://my.oschina.net/u/2345654/blog/1503676

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值