java线程学习(二)

      考虑有这样两个场景:    你的电脑上有5块硬盘(A,B,C,D,E),你有个隐藏的avi电影藏得很深,你不知道文件在哪个盘里。这时候就可以用到多线程了。你可以运用多线程挨盘查找,把所有的盘的同名文件都找出来,也可以多线程挨盘查找,不管哪个线程,只要找到文件了就退出整个线程池(这种找到即退出的形式在某些场景下,如查找最短路径,抢夺资源等方面)。

        只执行一个线程结果的代码如下:

public class ThreadTest2 {
	public static void main(String[] s){
		threadTest();
	}
	
	public static void threadTest() {
		ExecutorService pool = Executors.newFixedThreadPool(20);
		List<Callable<String>> tasks = new ArrayList<Callable<String>>();
		for (int i = 1; i < 6; i++) {
			final int temp = i;
			myTask t = new ThreadTest2().new myTask(temp);
			tasks.add(t);
		}
		try {
			String results = pool.invokeAny(tasks);
			System.out.println(results);
			System.out.println("===========主线程");
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	class myTask implements Callable<String> {
		final int flag;

		public myTask(int flag) {
			System.out.println("线程"+flag+"开始了,线程"+flag+"执行要耗时"+flag+"秒");
			this.flag = flag;
		}
		@Override
		public String call() throws Exception {
			System.out.println("线程"+flag+"正在执行------------");
			Thread.sleep(1000 * flag);
			System.out.println("线程"+flag+"执行结束-------");
			return "线程"+flag+"的执行结果";
		}

	}
}

 执行结果:

线程1开始了,线程1执行要耗时1秒
线程2开始了,线程2执行要耗时2秒
线程3开始了,线程3执行要耗时3秒
线程4开始了,线程4执行要耗时4秒
线程5开始了,线程5执行要耗时5秒
线程1正在执行------------
线程2正在执行------------
线程3正在执行------------
线程4正在执行------------
线程5正在执行------------
线程1执行结束-------
线程1的执行结果
===========主线程

 执行多个线程结果的代码,只需将主函数内的try语句里面的代码改为:

try {
			
			List<Future<String>> results = pool.invokeAll(tasks);

			for(Future<String> result:results){
				String r = result.get();
				System.out.println(r);
			}

 执行结果:

线程1开始了,线程1执行要耗时1秒
线程2开始了,线程2执行要耗时2秒
线程3开始了,线程3执行要耗时3秒
线程4开始了,线程4执行要耗时4秒
线程5开始了,线程5执行要耗时5秒
线程1正在执行------------
线程2正在执行------------
线程3正在执行------------
线程4正在执行------------
线程5正在执行------------
线程1执行结束-------
线程2执行结束-------
线程3执行结束-------
线程4执行结束-------
线程5执行结束-------
线程1的执行结果
线程2的执行结果
线程3的执行结果
线程4的执行结果
线程5的执行结果
===========主线程

       明天我会用这两种在我的电脑上查询我隐藏的视频文件,分别测试一下这两种线程方式的性能。

猜你喜欢

转载自709002341.iteye.com/blog/2252821