欢迎来到天天文库
浏览记录
ID:34465237
大小:48.19 KB
页数:7页
时间:2019-03-06
《并发基础(runnable、thread、executor)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、并发基础(Runnable、Thread、Executor) 与顺序编程不同,并发使程序可以在“同一时间”执行多个操作。 Java对并发编程提供了语言级别的支持。Java通过线程来实现并发程序。一个线程通常实现一个特定的任务,多个线程一起执行的时候就实现了并发。 定义任务的最简单的方式就是实现Runnable接口。1publicinterfaceRunnable{2publicabstractvoidrun();3} Runable只定义了一个run()方法。 下面是一个监听用户输入的任务。1pub
2、licclassMonitorimplementsRunnable{23@Override4publicvoidrun(){5BufferedReaderreader=newBufferedReader(newInputStreamReader(6System.in));7while(true){8Stringstr;9try{10str=reader.readLine();11if(str.equals("quit")){12return;13}else{14System.out.println(str);15}16
3、}catch(IOExceptione){17e.printStackTrace();18}1920}21}22} 执行一个任务最简单的方式是把它交给一个Thread构造器。1publicclassTest{2publicstaticvoidmain(String[]args){3System.out.println("MainStart");4Threadtask=newThread(newMonitor());5task.start();6System.out.println("MainEnd");7}8}
4、 执行上面的程序可以看到类似下面这样的结果: 可以看到Main方法一次执行各语句到最后输出“MainEnd”,但Monitor依旧在运行,因为它在另一个线程中。 除了Thread的方式,Java还提供了执行器Executor简化并发编程。 Executor使用execute(Runnablecommand)方法执行一个任务,使用shutdown()方法防止新任务被提交给Executor,当前线程将继续执行shutdown()方法调用之前提交的任务。像这样:1publicstaticvoidmain(S
5、tring[]args){2System.out.println("UseExecutor...");3ExecutorServiceexec=Executors.newCachedThreadPool();4exec.execute(newMonitor());5exec.shutdown();6} Executor的详细内容见《JavaExecutor框架分析》。 Runnable只是执行一个任务,但是并不能获取任务的执行结果(准确的说应该是run方法是一个void的方法,没有返回值)。如果希望获取任务的
6、执行结果,那么可以选择实现Callable接口。1publicinterfaceCallable{2Vcall()throwsException;3} 它是一个接收泛型,且具有返回内容的“任务接口”。下面是一个通过Callable执行任务并获取返回结果的例子。1publicclassTest{2publicstaticvoidmain(String[]args)throwsInterruptedException,3ExecutionException{4ExecutorServiceexec=Executo
7、rs.newCachedThreadPool();5List>results=newArrayList>();6for(inti=0;i<5;i++){7results.add(exec.submit(newTaskWithResult(i)));8}9exec.shutdown();10for(Futuref:results){11System.out.println(f.get());12}13}14}1516classTaskWithRe
8、sultimplementsCallable{17privateintid;1819publicTaskWithResult(intid){20this.id=id;21}2223@Override24publicStringcall()throwsException{25return"resultofTaskWi
此文档下载收益归作者所有