科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件基于JDK5.0的一些Thread总结(3)

基于JDK5.0的一些Thread总结(3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

8. Callables and Futures  实现多线程时一般用的是Runnable接口,但是他有一个问题就是他没有参数和返回值,所以当执行一个线程需要返回一个值的时候就不是很方便了

作者:中国IT实验室 来源:中国IT实验室 2007年8月22日

关键字: JDK5 Thread

  • 评论
  • 分享微博
  • 分享邮件

8. Callables and Futures

 实现多线程时一般用的是Runnable接口,但是他有一个问题就是他没有参数和返回值,所以当执行一个线程需要返回一个值的时候就不是很方便了。Callable接口和Runnable差不多,但是他提供了参数和返回值:


 public interface Callable<V>
{
V call() throws Exception;
}

而Future接口可以保留异步执行的值:

 public interface Future<V>
{
V get() throws . . .;
V get(long timeout, TimeUnit unit) throws . . .;
void cancel(boolean mayInterrupt);
boolean isCancelled();
boolean isDone();
}

FutureTask可以很方便的把Callable转换成Future和Runnable:

 Callable<Integer> myComputation = . . .;
FutureTask<Integer> task = new FutureTask<Integer>(myComputation);
Thread t = new Thread(task); // it's a Runnable
t.start();
. . .
Integer result = task.get(); // it's a Future

9.用Executors创建线程池

 用线程池有两个好处:

1. 减少创建线程的开销。
2. 控制线程的数量。

EXecutors提供了一些方法可以很方便的创建线程池:

 newCachedThreadPool
New threads are created as needed; idle threads are kept for 60 seconds.

newFixedThreadPool
The pool contains a fixed set of threads; idle threads are kept indefinitely.

newSingleThreadExecutor
A "pool" with a single thread that executes the submitted tasks sequentially.

newScheduledThreadPool
A fixed-thread pool for scheduled execution.

newSingleThreadScheduledExecutor
A single-thread "pool" for scheduled execution.

 在使用Executors时,先调用这些静态方法创建线程池,得到一个ExecutorService对象,然后用这个对象的submit方法提交你的Runnable或是Callable对象。
Future<?> submit(Runnable task)
Future<T> submit(Runnable task, T result)
Future<T> submit(Callable<T> task)
如果不再需要任何提交,就用shutdown方法来关闭线程池。

10.在界面中使用多线程

 对于GUI设计来说,很重要的一个原则就是要及时的给用户反馈,就算是不能立即得到结果,界面也不能停在那里,是用户不知道发生了什么事情,必须让用户随时知道程序在坐什么。所以当程序要执行一段需要消耗比较长时间的操作时,就要使用多线程。

 但是,有些界面控件并不是线程安全的,在使用这些控件时就要特别注意。在API doc中这些都有注明,使用的时候就可以查一下。

 如果想在自己另外所创建的线程执行过程中随时更新界面来表示执行进程,要注意的一点是,这个线程并不能直接调用界面控件的方法,而要采用EventQueue类的invokeLater,invokeAndWait方法:

 EventQueue.invokeLater(new
Runnable()
{
public void run()
{
label.setText(percentage + "% complete");
}
});

查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章