考虑有这样两个场景: 你的电脑上有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的执行结果 ===========主线程
明天我会用这两种在我的电脑上查询我隐藏的视频文件,分别测试一下这两种线程方式的性能。