大华笔试的两道编程题-多线程统计磁盘总...

题目1. 使用五个线程,求C/D/E/F四个磁盘大小的总和,磁盘DiskCount类如下,请完成剩余的工作:

public class DiskCount {

	/* 记录磁盘的总大小 */
	private int count;
	
	/* 获取一个磁盘的大小,采用随机数生成 */
	public int getDisk() {
		return (int)(Math.random() * 100 + 1);
	}
	
	/* 统计磁盘空间的大小 */
	public void countDisk(int diskCount) {
		count += diskCount;
	}
	
	/* 获得总磁盘空间的大小 */
	public int getTotalCount() {
		return count;
	}
}

自己的实现思路是,使用FixedThreadPool(),线程池大小为4,创建一个类集成Thread,由于要获得四个磁盘的统计值,因此线程池中的线程必须运行同一个Runable对象,具体实现如下:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class DiskCountMain extends Thread{

	/* 声明DiskCount 对象 dc */
	DiskCount dc = null;
	
	public DiskCountMain(DiskCount dc) {
		this.dc = dc;
	}
	
	/* 重写run()方法 */
	@Override
	public void run() {
		int diskCount = dc.getDisk();
		dc.countDisk(diskCount);
		System.out.println("Current disk count is " + diskCount);
	}
	
	/* 获取磁盘总的大小 */
	public int getTotalCount() {
		return dc.getTotalCount();
	}
	
	public static void main(String[] args) throws InterruptedException {
		/* 创建线程池,初始化大小为 4 */
		ExecutorService service = Executors.newFixedThreadPool(4);
		/* 创建DiskCountMain类的实例dcm */
		DiskCount dc = new DiskCount();
		DiskCountMain dcm = new DiskCountMain(dc);   // 所有线程池执行同一个对象
		
		for(int i = 0; i < 4; i++) {
			service.execute(dcm);
		}
		// service.awaitTermination()在shutdown() request请求之后执行
		service.shutdown();
		boolean closed = service.awaitTermination(10, TimeUnit.SECONDS);  // 最长等待10秒
		if(closed) {
			System.out.println("四个磁盘总的大小是: " + dcm.getTotalCount());
		}
		System.out.println("service is shutdown now!");
	}
}

执行结果如下图:

由于 service.awatiTermination() 需要在service.shutdown()之后执行,因此这里先调用了service.shutdown()。

?

题目2:字符串翻转

这个题目比较简单,这里给出自己的实现:

import java.util.Scanner;

public class StringReverse {

	/* 字符串反转方法1 */
	public String stringReverse1(String origin) {
		if (isNull(origin, "String can not be empty or null!")) 
			return "";
		StringBuilder sb = new StringBuilder(origin);
		sb.reverse();
		return sb.toString();
	}
	
	/* 字符串反转方法2 */
	public String stringReverse2(String origin) {
		if (isNull(origin, "String can not be empty or null!"))
			return "";
		char[] array = origin.toCharArray();
		int len = array.length;
		for (int i = 0, j = len-1; i < j; ++i, --j) {
			char tmp = array[i];
			array[i] = array[j];
			array[j] = tmp;
		}
		// return array.toString(); 则返回的是array地址的字符串表示。
		return new String(array);
	}
	
	/* 字符串合法性校验 */
	public boolean isNull(String str, String errorInfo) {
		if ("" == str || null == str) {
			System.out.println(errorInfo);
			return true;
		}
		return false;
	}
	
	public static void main(String[] args) {
		StringReverse sr = new StringReverse();
		Scanner scanner = new Scanner(System.in);
		String read = "";
       // 注意 == 和 equals的区别,如果使用==,则比较是对象的地址,循环永远无法结束。
		while(!"exit".equals(read = scanner.nextLine())) {
			System.out.println("stringReverse1 : " + sr.stringReverse1(read));
			System.out.println("stringReverse2 : " + sr.stringReverse2(read));
		}
		System.out.println("Test finish!");
	}
}

?

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章