面试题:两人共读一本书

张三	第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页

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

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 + "页");
		}
	}

}

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

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页

三、两人共读-使用单线程dom

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 + "页");
		}
	}
}

四、两人共读-多线程ide

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());
	}
	
}
相关文章
相关标签/搜索