|
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">MyTask <span class="hljs-keyword">implements <span class="hljs-title">Callable<<span class="hljs-title">Integer> {
<span class="hljs-keyword">private <span class="hljs-keyword">int upperBounds;
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-title">MyTask<span class="hljs-params">(<span class="hljs-keyword">int upperBounds) {
<span class="hljs-keyword">this.upperBounds = upperBounds;
}
<span class="hljs-meta">@Override
<span class="hljs-function"><span class="hljs-keyword">public Integer <span class="hljs-title">call<span class="hljs-params">() <span class="hljs-keyword">throws Exception {
<span class="hljs-keyword">int sum = <span class="hljs-number">0;
<span class="hljs-keyword">for(<span class="hljs-keyword">int i = <span class="hljs-number">1; i <= upperBounds; i++) {
sum += i;
}
<span class="hljs-keyword">return sum;
}
}
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">Test {
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">static <span class="hljs-keyword">void <span class="hljs-title">main<span class="hljs-params">(String[] args) <span class="hljs-keyword">throws Exception {
List<Future<Integer>> list = <span class="hljs-keyword">new ArrayList<>();
ExecutorService service = Executors.newFixedThreadPool(<span class="hljs-number">10);
<span class="hljs-keyword">for(<span class="hljs-keyword">int i = <span class="hljs-number">0; i < <span class="hljs-number">10; i++) {
list.add(service.submit(<span class="hljs-keyword">new MyTask((<span class="hljs-keyword">int) (Math.random() * <span class="hljs-number">100))));
}
<span class="hljs-keyword">int sum = <span class="hljs-number">0;
<span class="hljs-keyword">for(Future<Integer> future : list) {
<span class="hljs-comment">// while(!future.isDone()) ;
sum += future.get();
}
System.out.println(sum);
}
}
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler" title="点击并拖拽以移动" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" alt="" width="15" height="15" data-cke-widget-drag-handler="1">
62、synchronized关键字的用法?
答:synchronized关键字可以将对象或者方法标记为同步,以实现对对象和方法的互斥访问,可以用synchronized(对象) { … }定义同步代码块,或者在声明方法时将synchronized作为方法的修饰符。在第60题的例子中已经展示了synchronized关键字的用法。
63、举例说明同步和异步。
答:如果系统中存在临界资源(资源数量少于竞争资源的线程数量的资源),例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就必须进行同步存取(数据库操作中的排他锁就是最好的例子)。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。事实上,所谓的同步就是指阻塞式操作,而异步就是非阻塞式操作。
64、启动一个线程是调用run()还是start()方法?
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调(callback)的方法。
65、什么是线程池(thread pool)? (编辑:网站开发网_盐城站长网 )
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|